当前位置:网站首页>Room第一次使用

Room第一次使用

2022-06-10 23:08:00 刘忆初

简介:
Room 持久性库在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。具体来说,Room 具有以下优势:

  • 针对 SQL 查询的编译时验证。
  • 可最大限度减少重复和容易出错的样板代码的方便注解。
  • 简化了数据库迁移路径。

Room 包含三个主要组件:

  • 数据库类,用于保存数据库并作为应用持久性数据底层连接的主要访问点。
  • 数据实体,用于表示应用的数据库中的表。
  • 数据访问对象 (DAO),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。

1.创建实体

将一晚睡眠定义为一个带注解的表示数据库实体的数据类,需要记录
一晚睡眠的开始时间、
一晚睡眠的结束时间、
一晚睡眠的质量评分、
此外,还需要一个 ID 来唯一标识那一晚。

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(
       @PrimaryKey(autoGenerate = true)
       var nightId: Long = 0L,

       @ColumnInfo(name = "start_time_milli")
       val startTimeMilli: Long = System.currentTimeMillis(),

       @ColumnInfo(name = "end_time_milli")
       var endTimeMilli: Long = startTimeMilli,

       @ColumnInfo(name = "quality_rating")
       var sleepQuality: Int = -1
)

创建 SleepNight 数据类,参数包括 ID、开始时间、结束时间,以及数字形式的睡眠质量评分。

解释:

您必须初始化 sleepQuality,因此请将其设置为 -1,以表明未收集到质量数据。
将开始时间初始化为一个已知有效的时间。建议选择以毫秒表示的当前时间。
您还必须初始化结束时间。将其设置为开始时间,这表示尚未记录任何结束时间。

1.将 nightId 标识为主键,请为 nightId 属性添加 @PrimaryKey 注解。将参数 autoGenerate 设置为 true,让 Room 为每个实体生成 ID。这样做可以保证每晚的 ID 一定是唯一的。

2.在类声明的上方,为该数据类添加 @Entity 注解。此注解有多个可能的参数。默认情况下(@Entity 没有参数),表名称与类名称相同。不过,我们要使用 daily_sleep_quality_table 这个有用的表名称。tableName为可选参数,但强烈建议使用。

3.为其余属性添加 @ColumnInfo 注解。如下所示,使用参数自定义属性名称。

2.创建DAO

定义一个数据访问对象 (DAO),可以将 DAO 视为定义用于访问数据库的自定义接口,DAO 提供了插入、删除和更新数据库的便捷方法。

使用 Room 数据库时,需要通过在代码中定义和调用 Kotlin 函数来查询数据库。这些 Kotlin 函数会映射到 SQL 查询。可以使用注解在 DAO 中定义这些映射,而 Room 会创建必要的代码。

对于常见的数据库操作,Room 库会提供方便的注解,例如 @Insert、@Delete 和 @Update。

对于所有其他操作,都使用 @Query 注解。您可以编写 SQLite 支持的任何查询。

另一个好处是,当您在 Android Studio 中创建查询时,编译器会检查您的 SQL 查询是否存在语法错误。

对于睡眠之夜的睡眠跟踪器数据库,必须能够执行以下操作:

  • 插入新夜晚。
  • 更新现有夜晚的结束时间和质量评分。
  • 根据键获取特定夜晚的数据。
  • 获取所有夜晚的数据,并加以显示。
  • 获取最近一晚的数据。
  • 删除数据库中的所有条目。
@Dao
interface SleepDatabaseDao {
    @Insert
    fun insert(night: SleepNight)
    
    @Update
    fun update(night: SleepNight)
    
    @Query("SELECT * from daily_sleep_quality_table WHERE nightId = :key")
    fun get(key: Long): SleepNight?
    
    @Query("DELETE FROM daily_sleep_quality_table")
    fun clear()
    
    @Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC LIMIT 1")
    fun getTonight(): SleepNight?
    
    @Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC")
    fun getAllNights(): LiveData<List<SleepNight>>
}

解释:
1.所有 DAO 都需要使用 @Dao 关键字进行注解。
2.插入新夜晚: @Insert 注解。在 @Insert 下,添加一个 insert() 函数,该函数将 SleepNight 的实例作为其参数。大功告成。Room 将生成在数据库中插入 SleepNight 所需的全部代码。当您从 Kotlin 代码调用 insert() 时,Room 将执行 SQL 查询以将该实体插入到数据库中。(注意:可以随意调用该函数。)
3.更新现有的夜晚:添加 @Update 注解以及将一个 SleepNight 作为参数的 update() 函数。更新的实体是与所传入实体具有相同键的实体。您可以更新该实体的部分或全部其他属性。
4.其余功能没有方便使用的注解,因此您必须使用 @Query 注解并提供 SQLite 查询。
5.根据键获取特定夜晚的数据:添加一个 @Query 注解以及一个 get() 函数;该函数接受 Long key 参数,并返回可为 null 的 SleepNight。将 String 参数添加到 @Query(这是一个 SQLite 查询),用于检索特定 SleepNight 条目中的所有列。

  • 选择 daily_sleep_quality_table 中的所有列
  • WHERE 语句中的 nightId 匹配 :key 参数。

请注意 :key。在查询中使用英文冒号是为了引用该函数中的参数。

6.删除数据库中的所有条目:再添加一个 @Query,以及用于从 daily_sleep_quality_table 中删除 所有信息的 clear() 函数和 SQLite 查询。此查询不会删除表本身。

@Delete 注解会删除一项内容,您可以使用 @Delete 并提供要删除的夜晚列表。这种方法的缺点是,您需要提取或了解表中的内容。@Delete 注解非常适合用于删除特定条目,但在清除表中的所有条目方面效率较低。
7.获取最近一晚的数据:添加 @Query 注解和一个 getTonight() 函数。使 getTonight() 返回的 SleepNight 可为 null,以便函数能够处理表为空的情况。(该表在开始时是空的,在数据被清除后也是空的。)
为了从数据库中获取“今晚”的数据,可以编写一条 SQLite 查询,用于返回按 nightId 降序排列的结果列表中的第一个元素。使用 LIMIT 1 可仅返回一个元素。

8.获取所有夜晚的数据:添加 @Query 注解和一个 getAllNights() 函数:
让 SQLite 查询返回 daily_sleep_quality_table 中的所有列,并依降序排序。
让 getAllNights() 返回 SleepNight 实体的列表作为 LiveData。Room 会为您保持更新此 LiveData,也就是说,您只需要显式获取一次数据。

3.创建和测试ROOM数据库

@Database(entities = [SleepNight::class], version = 1, exportSchema = false)
abstract class SleepDatabase : RoomDatabase() {

	// 对于与数据库关联的每个 DAO 类,数据库类必须定义一个具有零参数的抽象方法,并返回 DAO 类的实例。
   abstact fun getDao():SleepDatabaseDao
 
   companion object {

       @Volatile
       private var INSTANCE: SleepDatabase? = null

       fun getInstance(context: Context): SleepDatabase {
           synchronized(this) {
               var instance = INSTANCE

               if (instance == null) {
                   instance = Room.databaseBuilder(
                           context.applicationContext,
                           SleepDatabase::class.java,
                           "sleep_history_database"
                   )
                           .fallbackToDestructiveMigration()
                           .build()
                   INSTANCE = instance
               }
               return instance
           }
       }
   }
}
原网站

版权声明
本文为[刘忆初]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_34512207/article/details/125205880