android 中Room 的简单使用

  • Post author:
  • Post category:其他


首先需要说明的是依赖,在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层的东西,已经测试能够存在的东西,接口,静态代码块



版权声明:本文为sinat_25136209原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。