Room
Room 是所谓的 ORM(对象关系映射)库
依赖
- 在项目级
build.gradle
文件中,在 ext 代码块中定义room_version
。
ext {kotlin_version = "1.6.20"nav_version = "2.4.1"room_version = '2.4.2'
}
- 在应用级
build.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"
使用
- 构建实体
使用 Room 时,每个表都由一个类表示。在 Room 等 ORM(对象关系映射)库中,这些类通常称为模型类或实体。
@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是数据表里面的列
- 构建数据访问对象
一个提供数据访问的 Kotlin 类。具体而言,会在 DAO 中包含用于读取和操作数据的函数。对 DAO 调用函数相当于对数据库执行 SQL 命令。
@Dao
interface ScheduleDao {@Query("SELECT * FROM schedule ORDER BY arrival_time ASC")
fun getAll(): List<Schedule>
}
定义一个函数 getAll()
,用于返回包含 @Query
注解的 Schedule
对象的列表
- 访问数据
虽然已经构建好整个访问数据的方法,但是我们也不能直接用VIew去访问,得用ViewModel,这也是推荐的MVVM模型
class BusScheduleViewModel(private val scheduleDao: ScheduleDao): ViewModel() {
调用方法就写在这上面
- 管理数据
我们需要一个类去管理跟数据有关的类,为什么要这么做?因为
a. 指定数据库中定义的实体。
b. 提供对每个 DAO 类的单个实例的访问。
c. 执行任何其他设置,例如预先填充数据库。
先添加一个抽象类AppDatabase,名字随意
@Database(entities = arrayOf(Schedule::class), version = 1)
abstract class AppDatabase: RoomDatabase() {companion object {@Volatile
private var INSTANCE: AppDatabase? = nullfun 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 = instanceinstance}
}}abstract fun scheduleDao(): ScheduleDao
}
通过这个类,可以轻松访问DAO类
使用 AppDatabase
类时,您需要确保仅存在一个数据库实例,以防出现竞态条件或其他潜在问题。该实例存储在伴生对象中,并且您还需要用一个方法来返回现有实例或首次创建数据库。此方法在伴生对象中定义。将以下 companion object
添加到 scheduleDao()
函数的正下方。
类前面的注解版本号:每次对架构做出更改时,版本号都会递增。应用会对照数据库中的版本检查此版本,以确定是否应执行迁移以及应如何执行迁移。
- 应用
在Application里面初始化
val database: AppDatabase by lazy { AppDatabase.getDatabase(this) }
参考网站:官方网站