Room数据库

今天看了一眼项目,想用Room代替现有数据存储的方式,于是简单看了下文档进行替换

一:了解三个必备的注解及对应的类:

   1、Entity:也就是我们定义的实体类,会通过注解映射到相应库字段

        



@Entity(tableName = "user")
class UserData {
    // 分配自动ID
    @PrimaryKey(autoGenerate = true) var id:Int=0
//    @Ignore // 其他构造方法需要添加此字段
    // 可指定字段名,不指定则为默认的key命
    @ColumnInfo(name = "userName") var user_name :String? = null
    companion object {
        val instance: User by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            User()
        }
    }

}

        2、Dao:通过dao操作数据库的增删改查

       


import androidx.room.*
import retrofit2.http.DELETE

@Dao
interface UserDataDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)// 当有老数据时就覆盖掉
    fun insertUser(user: UserData?): Long // 返回的long值为插入的条目的主键

    @Query("SELECT * FROM user")
    fun getUser(): UserData

    @Query("SELECT * FROM user WHERE USER_ID = :userId") // 语句与sql一样 like等等
    fun getUser(userId: String):UserData

    @Update
    fun update(user: UserData): Int // 返回int值为更新多少条

    @Update
    fun update(vararg user: UserData): Int 

    @Delete
    fun delete(user: UserData)
}

          3、Database:库信息,我们这里只需要继承RoomDatabase,当然也可以根据自己的需求定制一些其他的


import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import com.suyuemobi.kouhong.app.App

// 指定到表的映射关系和数据库版本
@Database(entities = [UserData::class], version = 1)
abstract class MyDatabase : RoomDatabase() {
    abstract fun userDao(): UserDataDao

    companion object{
         val instance:MyDatabase by lazy (mode =LazyThreadSafetyMode.SYNCHRONIZED){
             Room.databaseBuilder(App.instance,MyDatabase::class.java,"xxx").build()
         }
    }
}

二:配置Room

首先,项目根gradle文件加入库依赖:

  // kotlin版本
  implementation rootProject.ext.room["runtime"]
  kapt rootProject.ext.room["compiler"] // Kotlin 的话用kapt
  // java版本
  implementation rootProject.ext.room["runtime"]
  annotationProcessor rootProject.ext.room["compiler"] 

然后,指定注解生成的文件路径。

 //指定room.schemaLocation生成的文件路径
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }

最后,我们就可以使用了

 // 注意查询等操作需要在非主线程进行                   
 thread {
       
          var user =  userDao.insertUser(user)
          toast(user.user_name)
                       
                    }.start()

三:有点不爽的地方

现在感觉有点不爽的就是依赖等其他配置只能在app下的模块配置不能抽取到base模块下。不知道是不是有办法自己不知道。如果有欢迎大家指点哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值