在安卓开发中,新建数据库通常基于 Room 组件(推荐方式)或直接使用 SQLiteOpenHelper
,以下以 Room 为例说明流程:
在 build.gradle
中添加 Room 相关依赖:
// Room 核心库 implementation "androidx.room:room-runtime:2.5.1" // 编译时生成代码 annotationProcessor "androidx.room:room-compiler:2.5.1" // 可选:支持 LiveData 和 Coroutines implementation "androidx.room:room-ktx:2.5.1"
使用 @Entity
注解标记数据表,字段需指定 ColumnInfo
:
@Entity(tableName = "user") data class UserEntity ( @PrimaryKey(autoGenerate = true) val id: Int, @ColumnInfo(name = "name") val name: String, @ColumnInfo(name = "age") val age: Int )
通过 @Dao
定义数据库操作接口:
@Dao interface UserDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertUser(user: UserEntity) @Query("SELECT FROM user WHERE id = :userId") fun getUserById(userId: Int): LiveData<UserEntity> @Delete suspend fun deleteUser(user: UserEntity) }
通过 Room.databaseBuilder
初始化数据库:
@Database(entities = [UserEntity::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao companion object { @Volatile private var INSTANCE: AppDatabase? = null fun getDatabase(context: Context): AppDatabase { return INSTANCE ?: synchronized(this) { INSTANCE ?: Room.databaseBuilder( context.applicationContext, AppDatabase::class.java, "app_database" ).build().also { INSTANCE = it } } } } }
注解/功能 | 用途说明 | 常用场景示例 |
---|---|---|
@Entity |
标记数据表,需指定 tableName |
定义用户表、订单表等 |
@PrimaryKey |
标记主键,可设置 autoGenerate |
用户 ID、订单编号 |
@ColumnInfo |
自定义列名、类型等属性 | 列名与字段名不一致时使用 |
@Insert |
插入数据,onConflict 处理冲突策略 |
新增用户、保存缓存数据 |
@Update |
更新数据,需指定实体类 | 修改用户信息、更新订单状态 |
@Delete |
删除数据,支持单个或多个实体 | 删除用户、清理过期数据 |
@Query |
自定义 SQL 查询,支持返回 LiveData 或 Flow |
复杂查询、实时监听数据变化 |
suspend |
标记挂起函数,需在协程中调用 | 数据库操作涉及 IO 时使用 |
LiveData |
观察数据变化,自动通知 UI 更新 | 监听消息列表、用户状态 |
autoGenerate = true
):适用于无需业务控制的 ID,如用户表、日志表。@Embedded
组合多个字段,适用于唯一性约束复杂的表。@ForeignKey
关联表,DAO 中编写 @Transaction
包裹多个查询。@Relation
注解,Room 会自动处理连接逻辑。