public class DBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; private static final int VERSION = 1; public DBHelper(Context context){ super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建用户表 String sql = "CREATE TABLE user(" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT," + "age INTEGER)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级处理 db.execSQL("DROP TABLE IF EXISTS user"); onCreate(db); } }
// 插入数据 ContentValues values = new ContentValues(); values.put("name", "张三"); values.put("age", 25); getWritableDatabase().insert("user", null, values); // 查询数据 Cursor cursor = getReadableDatabase().query("user", null, null, null, null, null, null); while(cursor.moveToNext()){ int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); } cursor.close();
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name") public String name; @ColumnInfo(name = "age") public int age; }
@Dao public interface UserDao { @Insert void insertUser(User... users); @Query("SELECT FROM user WHERE id = :userId") User getUserById(int userId); @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 |
---|---|---|
编译时检查 | 无 | 支持(通过注解) |
线程安全 | 需手动处理 | 内置支持 |
返回值处理 | 原始Cursor | LiveData/Flow |
编译工具 | 无 | 自动生成相关代码 |
迁移支持 | 需手动实现 | 提供Migration API |
最佳实践 | 需自行封装 | 符合架构组件设计理念 |
Q1:数据库版本升级时如何处理数据迁移?
A1:在Room中可以通过添加Migration
对象处理:
static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { // 创建新表字段 database.execSQL("ALTER TABLE user ADD COLUMN address TEXT"); } }; AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db") .addMigrations(MIGRATION_1_2) .build();
传统SQLite需在onUpgrade()
方法中执行SQL语句进行表结构变更。
Q2:如何优化数据库读写性能?
A2:性能优化建议:
database.beginTransaction()
/setTransactionSuccessful()
/endTransaction()
@Index(value = {"name"})
inMemoryDatabase
)ANALYZE
命令优化查询计划