首先需要说明的是依赖,在java中的版本和 kotlin 中的版本依赖是不的同
1.首先是java 中的版本的依赖(如果你是用java来开发的就用java中的依赖,如果是kotlin开发就用koltin的依赖,这里专门指的是选择用kotlin还是java来编写Room相关类的意思)
def lifecycle_version = "2.2.0"
implementation "androidx.room:room-runtime:$lifecycle_version"
annotationProcessor "androidx.room:room-compiler:$lifecycle_version" // For Kotlin use kapt instead of annotationProcessor
// Test helpers
testImplementation "androidx.room:room-testing:$lifecycle_version"
kotlin 中的版本的依赖
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
}
def lifecycle_version = "2.2.0"
implementation "androidx.room:room-runtime:$room_version"
// For Kotlin use kapt instead of annotationProcessor
kapt "androidx.room:room-compiler:$room_version"
// optional - Kotlin Extensions and Coroutines support for Room 协程操作库
implementation "androidx.room:room-ktx:$room_version"
2.接着是创建表的表和列 (以kotlin 代码为例)
@Entity(tableName = "tableName")
data class OnTestBean constructor(
@PrimaryKey(autoGenerate = true)
var id: Int
) {
public constructor() :this(0)
@ColumnInfo(name = "_id")
var id: String? = null
@ColumnInfo(name = "desc")
var desc: String? = null
@ColumnInfo(name = "time")
var event_time: Long? = null
@ColumnInfo(name = "name")
var name: String? = null
}
}
这样就创建好了一个表,非常简洁。(注意上面的哪些注解,都是room 中的注解)
3.然后创建类似传统Sql中的增删改查语句
@Dao
interface OnTestBeanDao {
// 插入的方法
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertOnTestBean(bean: OnTestBean)
// 查询的方法
@Query("select * from tableName where time =:eventTime")
fun queryOnTestBean(eventTime: Long): OnTestBean
// 删除的方法
@Query("delete from tableName where time=:eventTime")
fun deleteOnTestBean(eventTime: Long)
}
唯一的缺点需要手写sql语句,没有传统sql的安卓原生api,不过也不难,如果不会,去找后台帮忙写写。
4.接着是创建数据库
@Database(entities = [OnTestBean::class], version = 1)
abstract class DataBase : RoomDatabase() {
abstract fun OnTestBeanDao(): OnEventDao?
// abstract fun OnTestBeanDao1(): OnEventDao1?
// abstract fun OnTestBeanDao2(): OnEventDao2?
}
@Database(entities = [OnTestBean::class], version = 1)
在这行语句中,entities中可以同时写多个bean,中间以逗号隔开。
如果要创建多个bean,同理需要创建多个dao。
5.创建类似传统sql 中的 databaseHelper
class DataBaseHelper constructor(context: Context) {
val database = Room.databaseBuilder(context, DataBase::class.java, "Data.db")
.build()
companion object {
@Volatile
var instance: DataBaseHelper? = null
@JvmStatic
fun getinstance(context: Context): DataBaseHelper {
synchronized(DataBaseHelper::class) {
if (instance == null) {
instance = DataBaseHelper(context.applicationContext)
}
}
return instance!!
}
}
// method1
fun insertData(data: OnTestBean) {
database.OnTestBeanDao()?.insertOnTestBean(data)
}
fun selectData(): List<OnTestBean> {
return database.OnTestBeanDao()?.queryOnTestBean()!!
}
// method4
fun deleteData(datas: List<OnTestBean>) {
for (i in datas.indices) {
database.OnTestBeanDao()?.deleteOnTestBean(datas[i].id)
}
}
}
6.在activity 中使用,需要注意的是,需要在子线程中进行创建数据库的操作。(下面这个使用是在java中使用上面的kotlin代码)
DataBaseHelper mDataBaseHelper = DataBaseHelper.getinstance(context);
List<OnTestBean> beans = mDataBaseHelper.selectData();
二. 关于room的升级,首先需要创建升级的语句,对于升级语句怎么来的?
其实不需要自己的,怎么才能得到这个升级语句呢?
//指定room.schemaLocation生成的文件路径
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
在 build.gradle 文件中这个语句,在每次run 的时候,都会生成一个文件,里面有自动编译好的sql 语句。直接复制里面的即可。
首先需要创建的语句,在 DataBaseHelper 这个类里面。
这里举个例子,比如 62 升级到 63
var MIGRATION_62_63: Migration = object : Migration(62, 63) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS `t_position` (`status` INTEGER NOT NULL, `work_status` INTEGER NOT NULL, `lat` REAL NOT NULL, `lng` REAL NOT NULL, `city_id` TEXT NOT NULL, `accuracy` REAL NOT NULL, `timestamp` INTEGER NOT NULL, `milli_timestamp` INTEGER NOT NULL, `provider` TEXT NOT NULL, `altitude` REAL NOT NULL, `speed` REAL NOT NULL, `bearing` REAL NOT NULL, `calc_type` INTEGER NOT NULL, `score` INTEGER NOT NULL, `satellites` INTEGER NOT NULL, `enclosure_index` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)")
}
}
然后在下面这个方法中,这样写
val database = Room.databaseBuilder(context, DataBase::class.java, "Data.db")
.addMigrations(MIGRATION_62_63)
.fallbackToDestructiveMigration() // 最好不要写这个,这个是失败策略。
.build()
然后在 DataBase 这个类中。这样写。那个version需要写上63,因为升级的目标就是63。
@Database(entities = [DriverStatus::class],version = 63)
abstract class DataBase :RoomDatabase() {
abstract fun getDriverStatusDao(): DriverStatusDao?
}
这样才能够实现room的升级。
room 中有坑的地方,在有 @Entity(tableName = “xxxx”) 这个类的地方不能有dao层的东西,已经测试能够存在的东西,接口,静态代码块