安卓开发中常用的数据库方案包括 SQLite(原生支持)和 Room(谷歌推荐的新型数据库层),以下是两者的核心区别:
特性 | SQLite | Room |
---|---|---|
开发复杂度 | 需手动编写 SQL 语句,易出错 | 提供抽象层,基于注解生成代码 |
编译时检查 | 无 | 支持(通过注解校验 SQL 正确性) |
架构组件集成 | 无 | 天然支持 LiveData、Coroutines、Flow |
最佳适用场景 | 简单需求、快速原型 | 复杂业务逻辑、需要架构组件联动的场景 |
添加依赖
在 build.gradle
中添加:
dependencies { implementation "androidx.room:room-runtime:2.5.1" kapt "androidx.room:room-compiler:2.5.1" // 如果使用 Kotlin }
定义实体类
用 @Entity
标注类,字段用 @ColumnInfo
指定列名:
@Entity(tableName = "user") data class User( @PrimaryKey(autoGenerate = true) val id: Int, @ColumnInfo(name = "name") val name: String, @ColumnInfo(name = "age") val age: Int )
创建 DAO(数据访问对象)
定义接口并用 @Dao
标注,方法用 @Insert
/@Update
/@Delete
/@Query
:
@Dao interface UserDao { @Insert suspend fun insertUser(user: User) @Query("SELECT FROM user WHERE id = :id") suspend fun getUserById(id: Int): User? @Delete suspend fun deleteUser(user: User) }
创建数据库类
用 @Database
标注,关联 DAO:
@Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
实例化数据库
在应用入口初始化:
val db = Room.databaseBuilder( context, AppDatabase::class.java, "app-database" ).build()
插入数据
val user = User(id = 0, name = "Alice", age = 25) db.userDao().insertUser(user)
查询数据(返回 LiveData)
@Query("SELECT FROM user") fun getAllUsers(): LiveData<List<User>>
异步操作(Coroutines)
lifecycleScope.launch { val users = db.userDao().getAllUsers().first() // 处理数据 }
问题 | 解决方案 |
---|---|
数据库升级失败 | 实现 Migration 接口,定义版本迁移逻辑 |
多线程导致数据冲突 | Room 默认支持多线程安全,无需额外处理(底层使用 ReentrantReadWriteLock ) |
数据加密需求 | 结合 SQLite + SQLCipher ,或使用第三方库(Room 暂不直接支持加密) |
解答:
ContentValues
或 SQLiteStatement
; 解答:
Room.databaseBuilder
中添加迁移策略: val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE user ADD COLUMN last_login INTEGER") } }
Room.databaseBuilder(context, AppDatabase::class.java, "db-name") .addMigrations(MIGRATION_1_2) .build()