1.导入依赖

  //room databaseimplementation 'androidx.room:room-runtime:2.2.3'annotationProcessor 'androidx.room:room-compiler:2.2.3'kapt 'androidx.room:room-compiler:2.2.3'androidTestImplementation 'androidx.room:room-testing:2.2.3'

2.gradle设置,在在顶部添加

apply plugin: 'kotlin-kapt'

defaultConfig括号内添加

           javaCompileOptions {annotationProcessorOptions {arguments = ["room.schemaLocation"  : "$projectDir/schemas".toString(),"room.incremental"     : "true","room.expandProjection": "true"]}}

3.新建实体类,就是建数据库表

@Entity(tableName = "worker" ,primaryKeys = arrayOf("id"))
data class Worker(@ColumnInfo(name = "id")var id: Long?,@ColumnInfo(name = "name")var name:String?)

4.新建Dao类,就是映射数据库操作到方法中(个人理解)

@Dao
interface WorkerDao {@Insert(onConflict = OnConflictStrategy.REPLACE)fun insertWorker(worker: Worker)@Query("DELETE FROM worker WHERE name=:name")fun deleteWorker(name: String)@Query("SELECT * FROM worker")fun queryAllWorkers(): List<Worker>@Query("SELECT * FROM worker WHERE id = :id")fun getWorkerById(id: Long): Worker
}

5.新建KotDatabase类,生成数据库

@Database(entities = [Worker::class], version = 1)
abstract class KotDatabase : RoomDatabase() {abstract fun getWorkerDao(): WorkerDaocompanion object {@Volatileprivate var INSTANCE: KotDatabase? = nullfun getInstance(context: Context): KotDatabase =INSTANCE ?: synchronized(this) {INSTANCE ?: buildDatabase(context).also { INSTANCE = it }}private fun buildDatabase(context: Context) =Room.databaseBuilder(context.applicationContext, KotDatabase::class.java, "kot.db").allowMainThreadQueries().build()}
}

这里啰嗦一句,如果不加上.allowMainThreadQueries(),你只能在子线程中操作,不能在UI主线程里操作,不然报错闪退
6.insert举例操作

  Thread{val worker = Worker(0,"李华")KotDatabase.getInstance(applicationContext).getWorkerDao().insertWorker(worker)val worker2 = Worker(11,"luoyanda")KotDatabase.getInstance(applicationContext).getWorkerDao().insertWorker(worker2)var workerM = KotDatabase.getInstance(applicationContext).getWorkerDao().getWorkerById(11);var message:Message = Message.obtain()message.what = 100message.obj = workerM.namemyHandler.sendMessage(message);}.start()

7.读写内存权限加上。

   if(ContextCompat.checkSelfPermission(applicationContext,android.Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED||ContextCompat.checkSelfPermission(applicationContext,android.Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(this@MainActivity, arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,android.Manifest.permission.READ_EXTERNAL_STORAGE),REQ_CODE_PERMISSION)}else{//todo
}。。。。override fun onRequestPermissionsResult(requestCode: Int,permissions: Array<out String>,grantResults: IntArray) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)when(requestCode){REQ_CODE_PERMISSION ->{if(grantResults.size>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED&&grantResults[1] ==PackageManager.PERMISSION_GRANTED){//todo}}}}

8.不用data class也行,不然有自增id时无法使用,这里使用普通的class也许,构造器里不添加自增id就行,kotlin会自动曾家get/set方法的。

@Entity(tableName = "student")
class Student{@PrimaryKey(autoGenerate = true)var id: Long = 0   //不影响第一个元素为1,后面自增var firstName: String? = nullvar lastName: String? = nullvar test:String? = nullconstructor(firstName: String?, lastName: String?, test: String?) {this.firstName = firstNamethis.lastName = lastNamethis.test = test}}

8.迁移,由于要改数据库表中的字段,比如之前没有test变量,在这里增加,保证之前的数据不会丢失。

//这里的version由1改为2,狠!狠!狠!重要,表明现在是2代数据库,如果后面再改以此为依据
@Database(entities = [Worker::class,Student::class], version = 2)
abstract class KotDatabase : RoomDatabase() {abstract fun getWorkerDao(): WorkerDaoabstract  fun getStudentDao():StudentDaocompanion object {@Volatileprivate var INSTANCE: KotDatabase? = nullfun getInstance(context: Context): KotDatabase =INSTANCE ?: synchronized(this) {INSTANCE ?: buildDatabase(context).also { INSTANCE = it }//不空就执行方括号里的代码}var dd: Migration = object : Migration(1,2){                 //由一代往二代迁移要做的操作override fun migrate(database: SupportSQLiteDatabase) {database.execSQL("ALTER TABLE student ADD COLUMN test TEXT default 'test' ")}}//调用迁移private fun buildDatabase(context: Context) =Room.databaseBuilder(context.applicationContext, KotDatabase::class.java, "kot.db").addMigrations(dd).allowMainThreadQueries().build()}
}

Kotlin使用Room数据库相关推荐

  1. Kotlin入门(26)数据库ManagedSQLiteOpenHelper

    共享参数毕竟只能存储简单的键值对数据,如果需要存取更复杂的关系型数据,就要用到数据库SQLite了.尽管SQLite只是手机上的轻量级数据库,但它麻雀虽小.五脏俱全,与Oracle一样存在数据库的创建 ...

  2. Kotlin入门教程——目录索引

    Kotlin是谷歌官方认可的Android开发语言,即将发布的Android Studio 3.0版本也会开始内置Kotlin,所以未来在App开发中Kotlin取代Java是大势所趋,就像当初And ...

  3. 【Android Jetpack】Room——基本使用篇

    文章目录 1. 前言 2. Kotlin中的数据库操作 2.1 依赖 2.2 基础概念 2.2 1 @Entity 2.2.2 @Dao 2.2.3 @Database 2.3 实战 3. 数据库版本 ...

  4. 区块链技术:架构及进展

    title: 区块链技术:架构及进展 总结归纳 1 引言 传统数据库 传统的关系型数据库管理系统.NoSQL数据库管理系统 单一机构进行管理和维护 单一机构对所有数据拥有绝对的控制权 其他机构无法完整 ...

  5. Spring Boot参考指南

    Spring Boot参考指南 作者 菲利普·韦伯,戴夫 Syer,约什 长,斯特凡 尼科尔,罗布 绞车,安迪·威尔金森,马塞尔 Overdijk,基督教 杜普伊斯,塞巴斯蒂安·德勒兹,迈克尔·西蒙斯 ...

  6. kotlin数据库_如何在Kotlin应用程序中使用Xodus数据库

    kotlin数据库 I want to show you how to use one of my favorite database choices for Kotlin applications. ...

  7. kotlin mysql数据库_在kotlin中使用mysql行级锁

    mysql中的锁 首先需要介绍一下mysql的锁.一般我们使用InnoDB数据库引擎+行级锁,SQL为:SELECT * FROM table where id = 1 for update;.for ...

  8. Kotlin (Java) 获取 mysql 数据库的所有表,表的所有字段,注释,字段类型

    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource import org.slf4j.LoggerFactory import org.sprin ...

  9. kotlin中使用Room数据库

    最近在kotlin环境下,写了一个room数据库的demo,各种情况跑了一下,在此总结一下. 涉及情况:增.删.改.查.排序 1.环境搭建 1.1.Android Studio下,新建一个kotlin ...

最新文章

  1. 个推CTO安森:我所理解的数据中台
  2. 惊了,AI已经学会刷LeetCode了!
  3. 练习. SQL--选修课程练习
  4. mysql的索引介绍_1
  5. Pin code码已被重置
  6. 软考中项20140309作业
  7. 开源 计划管理_公司开源计划的三大好处
  8. 【LeetCode】【HOT】49. 字母异位词分组(递归)
  9. 【训练题】分队 P1672
  10. Echarts pie 饼图类型后显示数据
  11. RHEL6 Tiny Linux 的制作
  12. Java 混淆那些事(五):ProGuard 其他的选项
  13. 弘辽科技:拼多多批发价格会影响活动价格吗?商家要不要改价?
  14. mysql如何存入汉字_[MYSQL]如何导入汉字单字到数据库
  15. 杨卫华:新浪微博的架构发展历程(转)
  16. DeepMind AI 科学家:2020年NLP和ML领域十大研究进展
  17. 使用OpenCV实现Halcon算法(1)亚像素提取边缘,Sub-Pixel Edge Detector
  18. C语言用数组实现十个国家名字按字典排序
  19. 织梦插件-织梦插件应用中心
  20. mysql设置字符集gb2312_MySQL字符集 GBK、GB2312、UTF8區別 解決 MYSQL中文亂碼問題

热门文章

  1. 武汉大学计算机学院教师名录,北京交通大学教师名录
  2. matlab计算复活节概率,复活节算法
  3. Winner(翻译)
  4. 艾美捷过氧化氢酶检测试剂盒的功能和应用
  5. 物联网和大数据解决方案如何改变数字医疗行业
  6. xshell换行对不齐,命令行乱飞问题
  7. groovy特性(Gradle的构建脚本是通过groovy编写的)
  8. [elasticsearch笔记]Managing the index lifecycle
  9. 最新行政区划代码省市区数据库(2018年5月1日 )
  10. 微软账户登录出现错误