依赖导入 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语句。