安卓开发中数据库的使用详解
SQLite 与 Room 的选择
安卓开发中常用的数据库方案包括 SQLite(原生支持)和 Room(谷歌推荐的新型数据库层),以下是两者的核心区别:
Room 数据库使用步骤
-
添加依赖
在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 暂不直接支持加密) |
相关问题与解答
问题1:Room 相比直接使用 SQLite 有什么优势?
解答:
- 编译时验证:Room 通过注解生成代码,可提前发现 SQL 错误;
- 减少样板代码:自动生成 DAO 实现类,避免手写
ContentValues
或SQLiteStatement
; - 架构组件集成:支持 LiveData 观察数据变化,简化 UI 更新逻辑;
- 类型安全:避免因字符串拼接导致的 SQL 注入风险。
问题2:如何处理数据库版本升级?
解答:
- 定义 Migration:在
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()
- 数据迁移逻辑:若无法自动迁移,需手动处理数据复制或清理