引入依赖

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的各种方法就可以使用了//需要注意,不能再主线程使用

android room 教程,android room 使用相关推荐

  1. Android 相机教程,Android 相机教程

    Android相机教程 相机主要用于捕获图片和视频.我们可以通过使用相机API的方法来控制相机. Android通过以下两种方式提供了在相机上工作的功能: 通过相机意图 通过相机API 了解相机意图和 ...

  2. Android精通教程-Android入门简介

    前言 大家好,我是 Vic,今天给大家带来Android精通教程-Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease ...

  3. android+notepad教程,Android平台应用开发实例:Notepad

    在这个教程中将会建立一个简单列表界面,允许用户添加删除,但是不能编辑.包括如下的内容: ◆ListActivities的基础知识和如何建立菜单项. ◆如何使用SQLite 数据库访问数据. ◆如何使用 ...

  4. android打开教程,Android 打开网络上pdf文件

    1.基本思路: 打开网络pdf 思路整体还是来源与图片的加载. android中加载网络图片的框架有很多个.如image-laoder, fresco.glide等,首先都是从内存中找图片,如果内存中 ...

  5. android开发教程,android开发入门教程

    所谓知己知彼才能百战百胜,想学好android就必须先了解 android是什么意思 android环境搭建 Android一词的本义指"机器人",同时也是Google于2007年 ...

  6. sqlite数据库android使用教程,Android开发教程之 SQLite数据库的使用

    在开发Android应用程序时经常需要存储数据,Android系统提供了SQLite数据库,还提供了SQLiteOpenHelper类,使我们可以很方便的操作数据库.通过一个例子来说明在Android ...

  7. android fragment 教程,Android app开发中的Fragment入门学习教程

    在Android3.0上开始引入了一个新概念叫Fragment.它有自己的布局文件,可以作为组件排布,也可以相互组合去实现不同的布局显示.使用Fragment可以重复利用代码,并且可以满足不同设备尺寸 ...

  8. android广播教程,Android学习笔记(广播机制)

    1.Android的广播机制介绍 收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同.接受广播时广播(发送方)并不在意我们(接收方)接收到广播时如何处理.好比我们收听交 ...

  9. android混淆教程,Android 实现代码混淆的实例

    Android 实现代码混淆的实例 1.简介 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为. 混淆的目的是为了加大反 ...

  10. android 动画教程,Android 动画Animation

    动画分为视图动画(view animation)和属性动画(property animation),视图动画又分为帧动画和补间动画 视图动画控件(iv)点击事件(OnClickListener接口)触 ...

最新文章

  1. Linux bash逐行读取文件的方法
  2. ASP.NET MVC的ContentResult
  3. rhcs集群套件—红帽6的高可用
  4. 抓包工具mitmproxy环境配置使用(一)
  5. 20175202 《Java程序设计》第九周学习总结
  6. 现代浏览器工作原理(一)
  7. Mssql,Access的sql经典SQL语句大全
  8. 计算机十二种常用密码的破解方法
  9. 宽带网速如何测试软件,怎样测试网速 多种测试网速方法【推荐】
  10. matlab进化树的下载,MEGA进化树下载
  11. 如何将图片转成Excel表格
  12. 实体消歧(链接到实体库)
  13. [资料分享] 干货~WLAN从入门到精通系列-WLAN技术连载帖汇
  14. data在python_Fake data的使用和产生 - Python篇
  15. 【学习笔记】无限极分类学习
  16. dva使用及项目搭建
  17. 美团外卖API接入(二)
  18. Windows睡眠,CPU风扇仍然运转的问题
  19. 洛谷3379-LCA-C++-(LCA+倍增)
  20. ETL(八):路由器(rounter)转换组件的使用

热门文章

  1. 知识资源整理(持续更新)
  2. 带通滤波器幅频特性曲线图_滤波器知识,你所要的,都在这里
  3. 【SDOI2008】Sandy的卡片 DP
  4. LoRa vs LTE-M vs Sigfox
  5. 089 定积分之双纽线、心形线、摆线
  6. win10计算机丢失msvcr,win10计算机丢失MSVCR120文件怎么办
  7. 数据结构最常用的排序算法一(冒泡、插入、选择)-Java实现
  8. 前端——列表、表格、表单
  9. js实现缓慢回到页面顶部
  10. Linux下Ubuntu的常用压缩、解压缩命令,以及tar中的参数 cvf,xvf,cvzf,zxvf的区别