Room新手入门

Room

Room 是所谓的 ORM(对象关系映射)库

依赖
  1. 在项目级 build.gradle 文件中,在 ext 代码块中定义 room_version

    ext {
    kotlin_version = "1.6.20"
    nav_version = "2.4.1"
    room_version = '2.4.2'
    }

  2. 在应用级 build.gradle 文件中,在依赖项列表末尾添加以下依赖项。

gradle 复制代码
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"

// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:$room_version"
使用
  1. 构建实体

使用 Room 时,每个表都由一个类表示。在 Room 等 ORM(对象关系映射)库中,这些类通常称为模型类或实体。

kotlin 复制代码
@Entity
data class Schedule(
   @PrimaryKey val id: Int,
   @NonNull @ColumnInfo(name = "stop_name") val stopName: String,
   @NonNull @ColumnInfo(name = "arrival_time") val arrivalTime: Int
)

要有主键,每个ColumnInfo是数据表里面的列

  1. 构建数据访问对象

一个提供数据访问的 Kotlin 类。具体而言,会在 DAO 中包含用于读取和操作数据的函数。对 DAO 调用函数相当于对数据库执行 SQL 命令。

kotlin 复制代码
@Dao
interface ScheduleDao {
    @Query("SELECT * FROM schedule ORDER BY arrival_time ASC")
fun getAll(): List<Schedule>
}

定义一个函数 getAll(),用于返回包含 @Query 注解的 Schedule 对象的列表

  1. 访问数据

虽然已经构建好整个访问数据的方法,但是我们也不能直接用VIew去访问,得用ViewModel,这也是推荐的MVVM模型

kotlin 复制代码
class BusScheduleViewModel(private val scheduleDao: ScheduleDao): ViewModel() {

调用方法就写在这上面

  1. 管理数据

我们需要一个类去管理跟数据有关的类,为什么要这么做?因为

a. 指定数据库中定义的实体。

b. 提供对每个 DAO 类的单个实例的访问。

c. 执行任何其他设置,例如预先填充数据库。

先添加一个抽象类AppDatabase,名字随意

kotlin 复制代码
@Database(entities = arrayOf(Schedule::class), version = 1)
abstract class AppDatabase: RoomDatabase() {
    companion object {
        @Volatile
private var INSTANCE: AppDatabase? = null
        
        fun getDatabase(context: Context): AppDatabase {
    return INSTANCE ?: synchronized(this) {
        val instance = Room.databaseBuilder(
            context,
            AppDatabase::class.java,
            "app_database")
            .createFromAsset("database/bus_schedule.db")
            .build()
        INSTANCE = instance

        instance
    }
}
        
}
    abstract fun scheduleDao(): ScheduleDao
}

通过这个类,可以轻松访问DAO类

使用 AppDatabase 类时,您需要确保仅存在一个数据库实例,以防出现竞态条件或其他潜在问题。该实例存储在伴生对象中,并且您还需要用一个方法来返回现有实例或首次创建数据库。此方法在伴生对象中定义。将以下 companion object 添加到 scheduleDao() 函数的正下方。

类前面的注解版本号:每次对架构做出更改时,版本号都会递增。应用会对照数据库中的版本检查此版本,以确定是否应执行迁移以及应如何执行迁移。

  1. 应用

在Application里面初始化
val database: AppDatabase by lazy { AppDatabase.getDatabase(this) }

参考网站:官方网站

相关推荐
枷锁—sha2 分钟前
【DVWA系列】——CSRF——Medium详细教程
android·服务器·前端·web安全·网络安全·csrf
Cao_Shixin攻城狮4 小时前
Flutter运行Android项目时显示java版本不兼容(Unsupported class file major version 65)的处理
android·java·flutter
呼啦啦呼啦啦啦啦啦啦7 小时前
利用pdfjs实现的pdf预览简单demo(包含翻页功能)
android·javascript·pdf
idjl8 小时前
Mysql测试题
android·adb
游戏开发爱好者811 小时前
iOS App 电池消耗管理与优化 提升用户体验的完整指南
android·ios·小程序·https·uni-app·iphone·webview
人生游戏牛马NPC1号11 小时前
学习 Flutter (四):玩安卓项目实战 - 中
android·学习·flutter
星辰也为你祝福h13 小时前
Android原生Dialog
android
梁同学与Android13 小时前
Android ---【CPU优化】需要优化的原因及优化的地方
android
Misha韩14 小时前
React Native 基础tabBar和自定义tabBar - bottom-tabs
android·react native
iHero14 小时前
【Nextcloud】在 Ubuntu 22.04.3 LTS 上的 Nextcloud Hub 10 (31.0.2) 后台任务cron 的优化
android·linux·ubuntu·nextcloud