📜  Android中Room Persistent Library介绍

📅  最后修改于: 2022-05-13 01:58:45.014000             🧑  作者: Mango

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 有几个优点:

  1. 查询在编译时进行验证。
  2. 减少样板代码。
  3. 易于掌握和应用。
  4. 与 RxJava、LiveData 和 Kotlin Coroutines 的集成很简单。

房间组件

房间由三个主要部分组成:

  1. 数据库:这包含数据库持有者,并用作应用程序持久化关系数据的主要访问点。
  2. 实体:数据库中由实体表示的表。
  3. DAO :这个类包含访问数据库的方法。

您的应用程序使用 Room 数据库来检索与您的数据库关联的数据访问对象或 DAO。然后应用程序使用每个 DAO 从数据库中检索实体,并将对这些实体的任何更改保存回数据库。最后,应用程序使用实体来检索和设置与数据库中的表列相对应的值。

数据库

如前所述,它包含数据库持有者,并充当与应用程序中持久的关系数据的底层连接的主要访问点。使用@Database 注解的类必须满足以下要求:

  1. 使用抽象类扩展 RoomDatabase。
  2. 在注释中,包括与数据库关联的实体列表。
  3. 包含一个不带参数的抽象方法,该方法返回带有@Dao 注释的类。
@Database(entities = arrayOf(User::class), version = 1)
abstract class courseDB: RoomDatabase() {
  abstract fun courseName(): courseDB
}

实体

数据库中的表由实体表示。此类标有@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()
  }
}