1.添加依赖:
plugins {
id 'kotlin-kapt'
}
def room_version = "2.2.5"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
// Kotlin 使用 kapt 替代 annotationProcessor
// 可选 - Kotlin扩展和协程支持
implementation "androidx.room:room-ktx:$room_version"
// 可选 - RxJava 支持
implementation "androidx.room:room-rxjava2:$room_version"
// 可选 - Guava 支持, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// 测试帮助
testImplementation "androidx.room:room-testing:$room_version"
2.建立实体,可以未普通类也可未data class:
package com.example.myapplication.school
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.example.myapplication.base.BaseEntity
@Entity(tableName = "t_teacher") //对应的是数据库中的表名称
class TeacherKt(name: String?, peopleNumber: String?) : BaseEntity(name, peopleNumber) {
@ColumnInfo(name = "level")//列明
private var level:Int? = null
@ColumnInfo(name = "teach_years")
private var teachYears:Int = 0
@ColumnInfo(name = "is_president")
private var isPresident:Int = 0 //是否是班主任,0不是,1是,默认不是,2超级管理员
@PrimaryKey(autoGenerate = true)
var id:Long = 0
constructor(name: String?, peopleNumber: String?,level:Int?,teachYears:Int):this(name, peopleNumber){
this.level = level
this.teachYears = teachYears
}
fun setIsPresident(value:Int) {
this.isPresident = value
}
fun getIsPresident():Int {
return isPresident
}
fun getLevel():Int? {
return this.level;
}
fun setLevel(level:Int?) {
this.level = level;
}
fun getTeachYears():Int {
return this.teachYears;
}
fun setTeachYears(teachYears:Int) {
this.teachYears = teachYears;
}
}
3.建立dao
package com.example.myapplication.data.dao
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import com.example.myapplication.school.TeacherKt
@Dao
interface TeacherDao {
@Query("select * from t_teacher")
fun getAll():MutableList<TeacherKt>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertOne(teacher:TeacherKt):Long
@Query("select * from t_teacher where people_name = :name and password = :password")
fun selectOne(name:String,password:String):TeacherKt
}
4.建立数据库database:
package com.example.myapplication.data.database
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import com.example.myapplication.data.Config
import com.example.myapplication.data.dao.TeacherDao
import com.example.myapplication.school.TeacherKt
@Database(entities = [TeacherKt::class],version = 2,exportSchema = false)
abstract class TeachDatabase:RoomDatabase() {
abstract fun teacherDao():TeacherDao?
companion object{
@Volatile private var instance:TeachDatabase? = null
fun getInstance(context: Context):TeachDatabase{
return instance?: synchronized(this) {
instance?: buildDatabase(context).also { instance = it }
}
}
private fun buildDatabase(context: Context):TeachDatabase{
return Room.databaseBuilder(context,TeachDatabase::class.java,Config.TEACH_DATABASE_NAME)
.build()
}
}
}
5.使用方式:Android-Room要求数据操作不能在UI线程中,需要在子线程中进行操作,因此使用kotlin的协程方式进行调用,kotlin协程参考:https://www.kotlincn.net/docs/reference/coroutines/coroutines-guide.html
使用协程首先添加依赖:
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2'
调用:
GlobalScope.launch {
val teacherDao = context?.let { it1 -> TeachDatabase.getInstance(it1) }?.teacherDao()
val id:Long = teacherDao?.insertOne(teacherKt) as Long
}