1、导入依赖库
plugins{
...
id("kotlin-kapt")
}
dependencies{
...
implementation("androidx.room:room-runtime:2.5.2")
annotationProcessor("androidx.room:room-compiler:2.5.2")
kapt("androidx.room:room-compiler:2.5.2")
implementation("androidx.room:room-ktx:2.5.2")
}
2、Room数据库构成
2.1 这是个人理解绘制成的UML类图
2.2、注意:
1.Dao里面的方法不写具体实现,Database里接Dao的是抽象方法,也没有具体实现
2.注意Database与Repositoty都是唯一的,外部不能直接创建,需要自己伴生类里面实现创建单例对象的方法,再把单例对象传出去
3、伴生对象companion
作用:不能实例化整个类,但可以创建该类的单例对象
如下代码:
一个变量instance保存该类对象,封装一个给外部创建单例对象的方法,当MusicDatabase写下时,伴生类里的方法和属性一并加载
Class MusicDatabase{
companion object{
private var instance: MusicDatabase? = null
fun getDatabase(context: Context): MusicDatabase {
if (instance == null) {
synchronized(this) {
if (instance == null) {
instance = Room.databaseBuilder(
context,
MusicDatabase::class.java,
"music_database"
).build()
}
}
}
return instance!!
}
}
}
4.注解的作用
4.1 数据类的注解
@Entity(tableName = "Music_table")
data class Music (
val musicId:String,
@PrimaryKey(autoGenerate = true)
val id:Int =0
)
@Entity 给数据类加注解,其中可以添加tableName = " 你想叫的表名",如果不加tableName,z则会自动给数据库映射一张于数据类名字相同的表 ,如此处会生成一张Music的表。
4.2 操作接口的注解
@Dao
interface MusicDao {
@Insert
suspend fun addMusic(music: Music)
@Query("delete from Music where musicId=:musicID")
fun deleteMusic(musicID:String)
@Query("select * from Music")
fun queryMusic():LiveData<List<Music>>
@Query("select * from Music where musicId=:musicID")
fun queryMusic(musicID:String):List<Music>
@Delete
fun delete(music: Music)
}
4.2.1 接口的注解
整个Dao接口前缀必须加上@Dao注解
4.2.2 各方法的注解
由于是接口,所以封装的每个方法,没有方法实现,但是可以再方法外加上增删改查的注解,再完善函数的参数和返回值,具体如下:
@Insert 表示插入向Room数据表中添加对应的数据
@Delete 表示删除Room数据库对应的数据,(自动帮你查找后删除)
@Update 表示更新Room数据库中指定图片的内容
@Query 能准确查一个表内数据("select * from 表名 where 数据类一个属性=此表内数据的对应属性值 "),
查找所有表内数据(select * from 表名),
准确查找一个表内数据删除 -》注解加“delete from 数据表名字 where 数据类一个属性 ”
4.2.3 Roomdatabse子类的注解
@Database(entities = [Music::class], version = 1)
abstract class MusicDatabase : RoomDatabase(){
}
标识关联的实体类 @Database(entities = [数据类名称::class], version = 你自己给的版本号)
注意必须是抽象类!!!
5.创建数据库单例给外部调用
abstract class MusicDatabase : RoomDatabase(){
abstract fun getMusicDao():MusicDao
companion object {
private var instance: MusicDatabase? = null
fun getDatabase(context: Context): MusicDatabase {
if (instance == null) {
synchronized(this) {
if (instance == null) {
instance = Room.databaseBuilder(
context,
MusicDatabase::class.java,
"music_database"
).build()
}
}
}
return instance!!
}
}
}
在伴生类中创建 该保存类对象的变量,和创建该对象的单例方法。
补充:关于Dao的调用逻辑
写好自定义Dao接口-》在RoomDatabase子类中,写抽象方法接Dao接口(直接使用系统自带方法,不用自己实现)-》在Repositoty中找到Database对象,由其调用接了Dao接口的方法。