📜  Kotlin 中的 Android Room Persistence Library

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

Kotlin 中的 Android Room Persistence Library

Android Room Persistence Library 是 Android Jetpack 提供的一组库之一,旨在帮助开发人员遵循最佳实践,同时消除样板代码并减少碎片。在 Android 应用程序中,我们经常需要存储结构化数据,将这些数据保存在本地总是一个好主意。这样,如果我们的应用程序崩溃或重新启动,数据就不会丢失,并且可以在以后检索这些数据。特别是当我们需要向用户显示一些相关信息时,即使在没有网络的情况下也需要显示这些信息时,将数据持久化到应用程序中非常方便。

使用 Room Persistence Library 的优势

Room 持久性库用作 SQLite 之上的抽象层,以实现更强大的数据库访问。与 SQLite API 相比,使用此库有几个优点,其中最突出的优点是可以更自然的方式轻松使用 SQLite。

  • Room 具有 SQL 查询的编译时验证这一出色功能,可减少运行时错误和崩溃的机会。
  • Room 可以返回 Live Data,即获取数据后反映在数据库中的自动即时更新。
  • 由于 Room 是作为用户的 ORM(对象关系映射)库,因此无需将数据转换为Java/Kotlin 对象,反之亦然。由于 Room 在内部将数据库对象映射到Java对象。
  • Room 可以方便地使用注释代替冗余和样板代码部分。
  • Room 的另一个惊人功能是,无需更改代码即可更改整个数据库架构。或从头开始。
  • Room 与 RxJava、Kotlin Coroutines、LifecycleObserver 等有很好的集成。

现在,既然我们对这个库附带的惊人功能有了一个想法,让我们深入研究一下。

房间的组成部分

Room 具有三个主要组件,即数据库、实体(如表)和 DAO(数据访问对象)。现在让我们一一讨论它们。

数据库



在 Room 中,使用 @Database 注释的抽象类在 SQLite 数据库上提供了一个抽象层。 Room 的这个组件是应用程序中持久化关系数据的主要访问资源。用于此目的的类必须是抽象的,包括与数据库关联的实体列表,包含一个没有参数的抽象方法,返回类型与用@Dao 注释的接口相同。例如,下面是一段代码片段,显示了一个名为AppDatabase 的此类带注释的类,该类继承自RoomDatabase

@Database(entities = [ToDoModel::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun toDoDao(): ToDoDao

    // Code Lines
}

实体

实体只不过是将数据库表的列表示为数据字段的类。此类使用@Entity 注释进行注释。类中的所有字段都必须是可访问的,即公共或使用 getter/setter 方法。还必须存在构造函数来创建条目实例。在 Kotlin 中,最好的方法是使用提供构造函数、getter 和 setter 方法的数据类,这些方法都是内在实现的。从SQL的知识可知,每个实体类必须至少有一个主键。为此,可以使用@PrimaryKey 注释对该特定字段进行注释以定义单个字段主键,或者如果有多个主键,则可以使用多个字段的@Entity 注释属性。如果我们不想保留在这些字段中,我们也可以使用 @Ignore 注释来注释字段。这里我们有一个 To-do 模型类作为示例,其中包含变量 title、description 和一个自动生成并充当主键的 id。

@Entity
data class ToDoModel (
        var title: String,
        var description: String,
        // autoGenrate -attribute to
        // automatically assign primary keys.
        @PrimaryKey(autoGenerate = true)    
        var id: Long = 0
)

Dao(数据访问对象)

如上所述,Room 允许开发人员以非常健壮和自然的方式使用 SQL 查询。这是我们看到这种情况发生的时候。 Dao 是一个带有@Dao 注释的接口,它拥有我们在使用中需要的所有 SQL 查询。这是通过使用各种注释(如@Insert、@Update、@Query、@Delete 等)来完成的,这些注释减少了样板,就像魔术般地添加或删除查询超级简单。它用作提供对数据库的访问的 API。这些方法在调用它们的线程上执行,因此我们必须确保它们不是使用主(UI)线程调用的。如果我们需要处理多个实体,我们不需要将各种方法从一个 Dao 复制到另一个,因为它也支持继承。为此,只需创建一个通用 BaseDao 类,并在其中定义各种 @Insert、@Update 和 @Delete 方法。下面是一个简单的 Dao 接口,具有插入、更新和查询方法。

@Dao
interface ToDoDao {
    @Insert()
    suspend fun insertTask(toDoModel: ToDoModel): Long
    
    @Update(onConflict = OnConflictStrategy.REPLACE)
    suspend fun updateTask(toDoModel: ToDoModel): Int

    @Query("SELECT * FROM ToDoModel WHERE isDone == 0")
    fun getTask(): LiveData>


    @Query("DELETE FROM ToDoModel WHERE id=:uid")
    fun deleteTask(uid: Long)
}

房间图书馆建筑

在浏览了 Room Library 的组件后,我们了解了每个组件如何单独工作以及它们的作用是什么。现在基于此,我们有这张图来表示它们的功能。我们可以看到我们获取的 Room Database 实例用于访问 Dao,而 Dao 又具有所有查询功能和对实体的控制。通过使用这些实体来获取和设置通过 Dao 中的查询提到的数据,数据被持久化。

房间持久化库架构

在应用程序中使用房间数据库的实现和设置

完整的项目请参考这篇文章:How to Build a Grocery Android App using MVVM and Room Database?

想要一个更快节奏和更具竞争力的环境来学习 Android 的基础知识吗?
单击此处前往由我们的专家精心策划的指南,旨在让您立即做好行业准备!