当前位置:网站首页>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
}
}
}
}
边栏推荐
- 【自动回复小脚本】新年快乐,每一个字都是我亲自手打的,不是转发哦~
- [pyGame collection] memory killing - "Childhood Games", how many shots did you get? (attach five source codes for self access)
- 测试下吧先
- Njupt South Post collection_ Experiment 2
- 【AI出牌器】第一次见这么“刺激”的斗地主,胜率高的关键因素竟是......
- MP framework basic operation (self use)
- [pyGame games] story stream recommendation: what kind of games can you like? (devil lover, bully's wife version)
- Njuptn Nanyou Discrete Mathematics_ Experiment 4
- [pyGame] this classic bomber super game is online. Do you love it? (source code attached)
- Why is the website snapshot hijacked and tampered with
猜你喜欢

【Pygame小游戏】这款“打地鼠”小游戏要火了(来来来)

【自动回复小脚本】新年快乐,每一个字都是我亲自手打的,不是转发哦~
![[pyGame games] story stream recommendation: what kind of games can you like? (devil lover, bully's wife version)](/img/77/653968895434f805d81a10406dcf6f.png)
[pyGame games] story stream recommendation: what kind of games can you like? (devil lover, bully's wife version)

Opencv实战之图像的基本操作:这效果出来惊艳了众人(附代码解析)

【漫天烟花】绚烂烟花点亮夜空也太美了叭、某程序员携带烟花秀给大家拜年啦~

USB IP core FPGA debugging (I)

Yum source update

yum源更新

博文推荐|构建 IoT 应用——FLiP 技术栈简介
![[pyGame] this](/img/7c/adc13c0c87ca31c8581d68e6f21363.jpg)
[pyGame] this "groundhog" game is going to be popular (come on, come on)
随机推荐
Things about Bluetooth development (1) -- starting with packet capturing data
JVM 垃圾回收机制和常见的垃圾回收器
Chapter I General introduction - Fundamentals of accounting
SQL查询,子查询作为结果字段
Why is the website snapshot hijacked and tampered with
【Go语言学习】——并发编程
数据库表结构
teterttet
Multipass Chinese document - Overview
[pyGame games] interesting puzzle game: how many hamsters can you play? (source code attached)
452. detonate the balloon with the minimum number of arrows
[daily] robots Txt allow all search engines to include
Chapter 2 application layer 2.4 DNS
[pyGame games] here it is. This Gobang game is super A. share it with your friends~
安全生产月,黄埔开展燃气安全进商铺宣传活动
Yii2 ActiveRecord 使用表关联出现的 id 自动去重问题
[database] types of NoSQL database
[pyGame] this classic bomber super game is online. Do you love it? (source code attached)
[JVM] garbage collection mechanism
Is the financial management of qiniu school reliable and safe