上一篇
安卓开发创建数据库
- 行业动态
- 2025-04-22
- 5
在Android中创建数据库通常使用SQLite,通过继承SQLiteOpenHelper类,重写onCreate()和onUpgrade()方法,执行SQL语句创建表结构,调用getWritableDatabase()获取
数据库实例,通过ContentValues或execSQL实现数据的增删改查操作
SQLite数据库创建与使用
创建数据库帮助类
public class DBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; // 数据库名称 private static final int DATABASE_VERSION = 1; // 版本号 public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } // 创建表结构 @Override public void onCreate(SQLiteDatabase db) { String sql = "CREATE TABLE user (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT NOT NULL," + "age INTEGER" + ")"; db.execSQL(sql); } // 数据库升级处理 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS user"); // 简单重建策略 onCreate(db); } }
数据库操作方法
操作类型 | 关键代码 | 说明 |
---|---|---|
插入数据 | SQLiteDatabase db = helper.getWritableDatabase();<br>ContentValues values = new ContentValues();<br>values.put("name", "张三");<br>values.put("age", 25);<br>db.insert("user", null, values); |
使用ContentValues构建参数 |
查询数据 | Cursor cursor = db.query("user", null, "age > ?", new String[]{"20"}, null, null, "age DESC"); |
条件查询并排序 |
更新数据 | ContentValues values = new ContentValues();<br>values.put("age", 26);<br>db.update("user", values, "name = ?", new String[]{"张三"}); |
根据条件更新 |
删除数据 | db.delete("user", "age < ?", new String[]{"18"}); |
删除指定记录 |
Room持久化库使用
定义实体类
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name", typeAffinity = ColumnInfo.TYPE_TEXT) public String name; @ColumnInfo(name = "age", typeAffinity = ColumnInfo.TYPE_INTEGER) public int age; }
创建DAO接口
@Dao public interface UserDao { @Insert void insertUser(User... users); // 支持批量插入 @Query("SELECT FROM user WHERE age > :minAge") List<User> getUsersByAge(int minAge); @Update void updateUser(User user); @Delete void deleteUser(User user); }
配置数据库
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
SQLite与Room对比
特性 | SQLite | Room |
---|---|---|
抽象层级 | 直接操作SQL语句 | 面向对象编程 |
编译检查 | 无 | 支持(通过注解校验) |
线程安全 | 需手动处理 | 自动支持(LiveData等) |
迁移管理 | 需手动实现 | 提供Migration API |
性能优化 | 原始SQL执行 | 编译时生成优化代码 |
常见问题与解答
问题1:数据库版本升级时如何处理数据迁移?
解答:
SQLite方案:
- 在
onUpgrade()
方法中编写迁移逻辑 - 示例:
ALTER TABLE user ADD COLUMN email TEXT
- 注意:直接修改表结构可能丢失数据
- 在
Room方案:
- 创建迁移对象:
static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE user ADD COLUMN email TEXT"); } };
- 在build时调用:
Room.databaseBuilder(...).addMigrations(MIGRATION_1_2).build()
- 创建迁移对象:
问题2:如何处理多表关联查询?
解答:
SQLite方案:
- 使用JOIN语句直接查询:
SELECT a.name, b.department FROM user a JOIN department b ON a.dept_id = b.id
- 注意:需要自己处理对象映射关系
- 使用JOIN语句直接查询:
Room方案:
使用
@Relation
注解:@Entity(tableName = "orders") public class Order { @PrimaryKey(autoGenerate = true) public int id; public int userId; } @Entity(tableName = "users") public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; @Relation(parentColumn = "id", entityColumn = "userId") public List<Order> orders; }
Room会自动处理嵌套对象的加载顺序