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"}); | 删除指定记录 |
@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 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 |
---|---|---|
抽象层级 | 直接操作SQL语句 | 面向对象编程 |
编译检查 | 无 | 支持(通过注解校验) |
线程安全 | 需手动处理 | 自动支持(LiveData等) |
迁移管理 | 需手动实现 | 提供Migration API |
性能优化 | 原始SQL执行 | 编译时生成优化代码 |
解答:
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"); } };
Room.databaseBuilder(...).addMigrations(MIGRATION_1_2).build()
解答:
SQLite方案:
SELECT a.name, b.department FROM user a JOIN department b ON a.dept_id = b.id
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会自动处理嵌套对象的加载顺序