Room数据库
Room数据库
Room是Android Jetpack组件中的一款SQLite数据库抽象层框架,旨在简化本地数据库操作,提供编译时SQL校验、类型与安全、与LiveData/Flow无缝集成等特性。
1. 什么是Room
定义:
- Room 是 Android Jetpack 提供的一个 ORM(对象关系映射)库,用于简化 SQLite 数据库操作。它将 SQLite 表映射为 Java/Kotlin 对象,通过注解自动生成数据库操作代码,避免手动编写 SQL 语句,提升开发效率和代码可维护性。
优势:
- 类型安全:编译时检查SQL查询,避免运行时错误。
- 减少样板代码:通过注解自动生成数据库操作代码。
- LiveData支持:与数据观察机制无缝集成,数据变化时自动通知UI。
2. Room的核心组件
Room框架由三个核心组件构成:
- Entity(实体类):
- 定义数据库中的表结构,每个Entity对应一张表。
- 通过注解配置字段、主键、索引等。
- DAO(Data Access Object,数据访问对象):
- 定义操作数据库的方法(增删改查)。
- 使用@Query、@Insert、@Update、@Delete等注解声明SQL操作。
- Database(数据库类):
- 作为数据库的入口,继承自RoomDatabase。
- 定义数据库版本、包含的Entity列表,并提供DAO的抽象方法。
3. Room的使用
1. 添加依赖:在 build.gradle
中添加 Room 依赖:
dependencies {def room_version = "2.6.1"implementation "androidx.room:room-runtime:$room_version"kapt "androidx.room:room-compiler:$room_version" // Kotlin 使用 kaptimplementation "androidx.room:room-ktx:$room_version" // 协程支持
}
2. 定义Entity
@Entity(tableName = "users")
data class User(@PrimaryKey(autoGenerate = true) val id: Int = 0,@ColumnInfo(name = "user_name") val name: String,@ColumnInfo(index = true) val age: Int // 创建索引
)
-
@Entity:标记为数据库表。
-
@PrimaryKey:定义主键,
autoGenerate
表示自增。 -
@ColumnInfo:自定义列名或添加索引。
3. 自定义DAO
@Dao
interface UserDao {@Insert(onConflict = OnConflictStrategy.REPLACE)suspend fun insert(user: User)@Deletesuspend fun delete(user: User)@Query("SELECT * FROM users WHERE age > :minAge")fun getUsersOlderThan(minAge: Int): Flow<List<User>>
}
-
@Insert/@Update/@Delete:简化增删改操作。
-
@Query:自定义 SQL 查询,支持参数绑定。
-
suspend:结合协程实现异步操作。
-
Flow:返回响应式数据流(需配合 Room 和 Kotlin 协程)。
4. 定义Database
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {abstract fun userDao(): UserDaocompanion object {private var instance: AppDatabase? = nullfun getInstance(context: Context): AppDatabase {return instance ?: synchronized(this) {instance ?: Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,"app_database").build().also { instance = it }}}}
}
-
@Database:声明数据库版本和包含的 Entity。
-
单例模式:确保全局唯一数据库实例。
-
Room.databaseBuilder:创建数据库实例。
4. Room与MVVM的整合
在MVVM架构中,Room通常通过Repository层被ViewModel调用。
- Entity:对应数据模型。
- DAO:定义数据操作接口。
- Repository:封装数据来源(Room 或网络),为 ViewModel 提供统一接口。
- ViewModel:通过 LiveData 暴露数据给 UI。
class UserRepository(private val userDao: UserDao) {val users: Flow<List<User>> = userDao.getAllUsers()suspend fun insert(user: User) = userDao.insert(user)
}class UserViewModel(private val repository: UserRepository) : ViewModel() {val users: Flow<List<User>> = repository.usersfun addUser(name: String, age: Int) {viewModelScope.launch {repository.insert(User(name = name, age = age))}}
}