上一篇
安卓开发数据库如何使用
- 行业动态
- 2025-04-21
- 8
安卓开发中数据库的使用详解
SQLite 与 Room 的选择
安卓开发中常用的数据库方案包括 SQLite(原生支持)和 Room(谷歌推荐的新型数据库层),以下是两者的核心区别:
特性 | SQLite | Room |
---|---|---|
开发复杂度 | 需手动编写 SQL 语句,易出错 | 提供抽象层,基于注解生成代码 |
编译时检查 | 无 | 支持(通过注解校验 SQL 正确性) |
架构组件集成 | 无 | 天然支持 LiveData、Coroutines、Flow |
最佳适用场景 | 简单需求、快速原型 | 复杂业务逻辑、需要架构组件联动的场景 |
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()
- 数据迁移逻辑:若无法自动迁移,需手动处理数据复制或清理