Room的基本使用


依赖导入 kotlin项目

plugins {
    id 'kotlin-kapt'
}


dependencies {
  def room_version = "2.3.0"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-ktx:$room_version"
}

实体

一个实体就是一张表

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "user")
data class Users(
    @ColumnInfo(name = "user", defaultValue = "wuHongRu")
    var userName: String ,
    @ColumnInfo
    var password: String
) {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    var id:Long = 0
}

Dao

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query

@Dao
interface UserDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE, entity = Users::class)
    fun insertUser(vararg user:Users)
    @Query("select * from user ")
    fun loadAllUsers():List<Users>
    @Query("select * from user where userName = :name")
    fun selectOneUser(name:String):List<Users>
    @Update
    fun updateOneUser(user:Users)

}

Database

设计成单例模式加同步锁 构造实例的时候要传入applicationContext 否则可能造成内存泄漏

  • entities : 指定添加进来的数据库表,这里以数组形式添加,如果项目用到多个表可以用逗号隔开。
  • version : 当前数据库的版本号,当数据库升级的时候会用到 。
  • exportSchema : 导出为文件模式,默认为true,这里要设置为false,不然会报警告。
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(version = 1, entities = [Users::class],exportSchema = false)
abstract class UserDatabase:RoomDatabase() {

    abstract fun userDao():UserDao

    companion object{
        private var instance:UserDatabase ?=null
        @Synchronized
        fun getDataBase(context:Context):UserDatabase{
            instance?.let { return it }
            return Room.databaseBuilder(context.applicationContext,UserDatabase::class.java,"user_database")
                .build().apply {
                    instance = this
                }
        }
    }
}

使用

创建统一仓库

class UserRepository(private val userDao:UserDao) {

    //可变参数 本质为数组
    fun insertUsers(vararg user:Users){
        userDao.insertUser(*user)
    }

    fun loadAllUser():List<Users>{
        return userDao.loadAllUsers()
    }
}

在activity中 默认不允许在主线程中操作数据库 在构建数据库的时候使用allowMainThreadQueries()可以在主线程中操作 但是仅建议测试环境下使用

private val database by lazy { UserDatabase.getDataBase(this) }
private val repository by lazy { UserRepository(database.userDao()) }
override fun onCreate(savedInstanceState: Bundle?) {
  mBinding.apply{
      insert.setOnClickListener {
        lifecycleScope.launch {
            withContext(Dispatchers.IO){
                repository.insertUsers(Users("wuhongru","232323"))
            }
        }
        }
  }
}

数据库升级

  • 在Room构建数据库是通过addMigrations(Migration migrations)方法进行版本升级。
  • Migration(int startVersion, int endVersion)方法是指定从什么版本升级到哪一版本。
  • 在重写的migrate(database: SupportSQLiteDatabase)方法中执行更新的sql语句。

文章作者: Lao Wu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lao Wu !
评论
  目录