使用的流程跟在Java中的使用方式一致,但是代码会大大简化
配置依赖:
kotlin和Java依赖配置是不同的,使用Kotlin需要在gradle导入一个插件kotlin-kapt,在依赖项中,不能使用annotationProcessor,需要使用kapt
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
}
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
//这种方式在Kotlin中不能使用,官方文档中的使用方式是错误的❎
//annotationProcessor "androidx.room:room-compiler:$room_version"
如果使用annotationProcessor来配置依赖,会出现下面的错误
cannot find implementation for xxx.DataBase. DataBase_Impl does not exist
1 数据类和普通类的区别
先定义一个普通类
class User(var name: String,var age:Int)
打印User对象,输出的是这个对象的地址
var user = User("ming", 12)
println(user)
输出:com.example.kotlinlearn.ExampleUnitTest$User@3e280074
但是如果是一个数据类,那么输出的就是toString 字符串
User(name=ming, age=12)
因此在使用Kotlin时,Bean对象建议使用数据类
2 Room实体类
在Java中,创建一个Room实体类,如果字段少,至少得10-20行代码,构造方法,get set方法等等,那么在Kotlin中,只需要一行代码
@Entity
data class User(
@PrimaryKey var _id:Number,
@ColumnInfo(name = "username") var username:String,
@ColumnInfo(name = "password") var password:String
)
3 Dao
Dao的使用和Java一致
@Dao
interface UserDao {
@Insert
fun insert(vararg user:User)
@Query("select * from user")
fun getAllUser():List<User>
@Query("select * from user where username=:username")
fun getUserByUsername(username:String) : User
}
4 DataBase
@Database(entities = arrayOf(User::class),exportSchema = true,version = 1)
abstract class DataBase : RoomDatabase(){
abstract fun UserDao() : UserDao
}
5 DataBase的初始化
class DataBaseManager {
private lateinit var builder:DataBase;
companion object{
val instance:DataBaseManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
DataBaseManager()
}
}
//初始化数据库
fun init(context:Context){
builder = Room.databaseBuilder(
context,
DataBase::class.java,
"tal_database"
).build()
}
//获取用户数据表
fun getUserDao():UserDao{
return builder.UserDao()
}
}
除了实体类的定义之外,其他的使用方式跟Java基本一致,没有太大的学习成本,如果Java掌握的梳理,使用Kotlin就很容易了。