kotlin:android-room的使用初体验

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
            }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容