Android中Room Persistent Library介绍
Room 是一个用于 Android 的持久性库,是 Google 的 Android Jetpack 项目的一部分。根据文档,Room 充当 SQLite 之上的抽象层,允许流畅的数据库访问,同时利用 SQLite 的全部功能。处理大量结构化数据的应用程序可以从本地存储中受益匪浅。最常见的应用是缓存相关数据。因此,即使设备无法连接到网络,用户仍然可以在离线时访问内容。设备重新联机后,任何用户启动的内容更改都会同步到服务器。
在您的项目中腾出更多空间
在您的模块(应用程序)的 build.gradle 文件中,包括以下内容:
dependencies {
implementation "androidx.room:room-runtime:2.2.5"
kapt "androidx.room:room-compiler:2.2.5"
}
使用房间的好处
与 SQLiteOpenHelper 等其他替代方法相比,使用 Room 有几个优点:
- 查询在编译时进行验证。
- 减少样板代码。
- 易于掌握和应用。
- 与 RxJava、LiveData 和 Kotlin Coroutines 的集成很简单。
房间组件
房间由三个主要部分组成:
- 数据库:这包含数据库持有者,并用作应用程序持久化关系数据的主要访问点。
- 实体:数据库中由实体表示的表。
- DAO :这个类包含访问数据库的方法。
您的应用程序使用 Room 数据库来检索与您的数据库关联的数据访问对象或 DAO。然后应用程序使用每个 DAO 从数据库中检索实体,并将对这些实体的任何更改保存回数据库。最后,应用程序使用实体来检索和设置与数据库中的表列相对应的值。
数据库
如前所述,它包含数据库持有者,并充当与应用程序中持久的关系数据的底层连接的主要访问点。使用@Database 注解的类必须满足以下要求:
- 使用抽象类扩展 RoomDatabase。
- 在注释中,包括与数据库关联的实体列表。
- 包含一个不带参数的抽象方法,该方法返回带有@Dao 注释的类。
@Database(entities = arrayOf(User::class), version = 1)
abstract class courseDB: RoomDatabase() {
abstract fun courseName(): courseDB
}
GeekTip: When instantiating a RoomDatabase object, you should use the singleton design pattern if your app runs in a single process. Each RoomDatabase instance is reasonably priced, and you rarely require access to multiple instances within a single process.
实体
数据库中的表由实体表示。此类标有@Entity 注释。此类的数据成员表示表中的列。实体的字段必须全部是公共的或具有 getter 和 setter 方法。如果所有字段都可访问,则实体类应该有一个空函数Object() { [native code] } 或一个接受所有字段的参数化函数Object() { [native code] }。部分构造函数也可以在 Room 中使用。每个实体类至少需要一个主键。要定义单个字段的主键,请使用 @PrimaryKey 注释,或为多个字段使用 @Entity 注释的 primaryKeys 属性。您还可以使用 @PrimaryKey 注释的 autoGenerate 属性自动分配主键。
@Entity
data class User(
@PrimaryKey val uid: Int,
@ColumnInfo(name = "courseName") val firstName: String?,
@ColumnInfo(name = "courseHolder") val lastName: String?
)
要将索引添加到实体,请使用 @Entity 注释的 indices 属性。您还可以通过将@Index注释的唯一属性设置为 true 来创建唯一索引。
@Entity(indices = arrayOf(Index(value = ["courseHolder", "address"])))@Entity(indices = arrayOf(Index(value = ["courseName", "courseHolder"],
unique = true)))
数据访问对象 (DAO)
DAO 提供了与数据库交互的 API。这是一个带有@Dao注解的接口。该接口的方法都用于从数据库中检索数据或对数据库进行更改。 @Query 、 @Insert和@Delete等注解用于标识这些方法。
@Dao
interface courseDAO{
@Query("SELECT * FROM course")
fun getAll(): List
@Query("SELECT * FROM course WHERE uid IN (:userIds)")
fun loadAllByIds(userIds: IntArray): List
@Insert
fun insertAll(vararg courses: User)
@Delete
fun delete(course: Courses)
}
转换类型
有时您可能需要在单个数据库列中保留自定义数据类型。类型转换器在这些情况下很有用。
class GFG {
@TypeConverter
fun fromTimestamp(value: Long?): Date? {
return value?.let { Date(it) }
}
@TypeConverter
fun dateToTimestamp(date: Date?): Long? {
return date?.time?.toLong()
}
}