引入依赖
def room_version = "2.2.5"
implementation "androidx.room:room-runtime:$room_version"
implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version"
在android 配置中加入
apply plugin: 'kotlin-kapt' //kapt
android{
...
defaultConfig{
...//指定room.schemaLocation生成的文件路径
javaCompileOptions {
annotationProcessorOptions {
arguments= ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
}
...
}
定义相应的实体类
@Entity(tableName = "t_user")classUser {
@PrimaryKey
@NonNull
var id: String= ""var username: String? = nullvar name: String? = nullvar sex: Int? = nullvar pic: String? = nullvar area: String? = nullvar phone: String? = nullvar address: String? = nullvar disabled: Boolean? = nullvar delFlag: Boolean? = null}
字符串主键 一定要添加 @NonNull 注解
下面就是dao了
@DaointerfaceUserDao {
@Query("select * from t_user where id=:id limit 1")
fun get(id:String): User?@Query("select * from t_user where delFlag = false")
fun query():List
//插入或更新
@Insert(onConflict =OnConflictStrategy.REPLACE)
fun insertOrUpdate(user: User)
@Query("delete from t_user where id=:id")
fun delete(id: String)
}
然后就是database类
@Database(entities = [User::class, 其他定义的数据类...],version = 1,exportSchema = true)
@TypeConverters(DateConverter::class, BoolConverter::class)abstract classAppDatabase : RoomDatabase() {abstractfun userDao(): UserDao
...
}
@TypeConverters 这里使用了两个自定义的转换器 处理
1.数字转boolean
classBoolConverter {
@TypeConverter
fun revertDate(value: Number): Boolean {return value == 1}
@TypeConverter
fun converterDate(value: Boolean): Number {return if(value) 1 else 0}
}
2.毫秒数转日期
classDateConverter {
@TypeConverter
fun revertDate(value: Long): Date {returnDate(value)
}
@TypeConverter
fun converterDate(value: Date): Long {returnvalue.time
}
}
然后定义一个database帮助类
object AppDatabaseHelper {privatevar appDatabase: AppDatabase
init {//MyApp 是自定义application类
val appContext =MyApp.instance.applicationContext
appDatabase= Room.databaseBuilder(appContext, AppDatabase::class.java,"mydb")
.allowMainThreadQueries()
.fallbackToDestructiveMigration()//升级数据库版本 清空数据库//.addMigrations(MIGRATION_1_2,...) 可以自己定制数据库迁移
.build()//比如1版本升级2版本 消息表增加了一个字段msgId//val MIGRATION_1_2 = object :Migration(1,2){//override fun migrate(database: SupportSQLiteDatabase) {//database.execSQL("ALTER TABLE t_msg "//+ " ADD COLUMN msgId TEXT");//}//}
}
fun getInstance(): AppDatabase {returnappDatabase
}
}
最后是使用
private val userDao =AppDatabaseHelper.getInstance().userDao()//调用dao的各种方法就可以使用了//需要注意,不能再主线程使用