Android_Room使用

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接口的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值