文章目录

  • Jetpack Room
    • 概述
    • 添加依赖
    • Room组成部分
    • 配置数据库
      • 定义Entity
      • 定义Dao
      • 定义Database
      • 初始化操作
    • 操作数据库
      • 增加数据
      • 删除数据
      • 修改数据
      • 查询数据
      • 事务
    • 高级用法
      • 嵌套对象
      • 一对一
      • 一对多
    • 数据库升级
      • 新增表
      • 新增表字段
    • 源码下载

Jetpack Room

概述

  • Google推出的Jetpack组件之一
  • 功能强大,使用简单,支持数据库监听等

添加依赖

plugins {id 'com.android.application'id 'kotlin-android'id 'kotlin-kapt'
}dependencies {def room_version = "2.3.0"implementation("androidx.room:room-runtime:$room_version")annotationProcessor "androidx.room:room-compiler:$room_version"kapt("androidx.room:room-compiler:$room_version")
}

Room组成部分

Room主要由三个部分组成:

  • DataBase:数据库持有者。
  • Entity:数据库中对应的表。
  • DAO:提供访问数据库的方法。

开发者需要使用DataBase获取DAO对象,通过DAO操作Entity,Room数据库相关操作必须在子线程中执行。

配置数据库

定义Entity

@Entity
data class User(var firstName: String, var lastName: String, var age: Int) {@PrimaryKey(autoGenerate = true)var id: Long = 0
}

定义Dao

@Dao
interface UserDao {@Insertfun insertUser(user: User)@Insertfun insertAllUser(user: List<User>)@Updatefun updateUser(newUser: User)@Query("update User set age=100 where age= :age")fun updateUserWithAge(age: Int)@Query("select * from User")fun queryAllUsers(): List<User>@Query("select * from User where age >= :age")fun queryUserByAge(age: Int): List<User>@Deletefun deleteUser(user: User)@Query("delete from User where age = :age")fun deleteUserByAge(age: Int): Int
}

定义Database

@Database(version = 1, entities = [User::class])
abstract class MyRoomDatabase : RoomDatabase() {companion object {private var instance: MyRoomDatabase? = nullprivate const val DB_NAME = "myroom"@Synchronizedfun getDatabase(context: Context): MyRoomDatabase {instance?.let {return it}return Room.databaseBuilder(context.applicationContext,MyRoomDatabase::class.java,DB_NAME).build().apply {instance = this}}}abstract fun userDao(): UserDao
}

初始化操作

userDao = MyRoomDatabase.getDatabase(this).userDao()

操作数据库

增加数据

增加一条数据

val user = User("小", "明", 18)
userDao.insertUser(user)

增加多条数据

val userList =
arrayListOf<User>(User("小", "白", 18),User("小", "黑", 28),User("大", "白", 38),User("大", "黑", 48)
)
userDao.insertAllUser(userList)

删除数据

删除条件数据

userDao.deleteUserByAge(28)

修改数据

修改条件数据

userDao.updateUserWithAge(48)

修改数据根据主键

val userList = userDao.queryUserByAge(20)
for (user in userList) {user.age = 1000userDao.updateUser(user)
}

查询数据

查询所有数据

val userList = userDao.queryAllUsers()

查询条件数据

val userList = userDao.queryUserByAge(20)

事务

//方式一
//使用注解
@Transaction
private fun transaction1() {thread {userDao.insertUser(User("李", "四", 28))userDao.insertUser(User("张", "三", 18))userDao.deleteUserByAge(28)}
}//方式二
//使用runInTransaction
private fun transaction2() {thread {MyRoomDatabase.getDatabase(this).runInTransaction {userDao.insertUser(User("李", "四", 28))userDao.insertUser(User("张", "三", 18))userDao.deleteUserByAge(28)}}
}

高级用法

嵌套对象

data class Address(var addr: String?, var detailAddress: String?)@Entity
data class Consumer(var name: String,var age: Int,@Embeddedvar address: Address? = null
) {@PrimaryKey(autoGenerate = true)var id: Long = 0L
}

注:最终Consumer表中一共有:id、name、age、addr、detailAddress字段

一对一

//Entity@Entity
data class Consumer(var name: String,var age: Int,@Embeddedvar address: Address? = null
) {@PrimaryKey(autoGenerate = true)var id: Long = 0L
}@Entity
data class Library(var libraryName: String,var consumerId: Long
) {@PrimaryKey(autoGenerate = true)var libraryId: Long = 0L
}//一对一关联类
data class ConsumerAndLibrary(@Embeddedvar consumer: Consumer,@Relation(parentColumn = "id", entityColumn = "consumerId")var library: Library
)
//Dao//一对一查询
@Transaction
@Query("SELECT * FROM Consumer")
fun getConsumerAndLibraryList(): List<ConsumerAndLibrary>

查询操作:

val consumerAndLibraryList =
MyRoomDatabase.getDatabase(this).libraryDao().getConsumerAndLibraryList()
for (i in consumerAndLibraryList) {log(i)
}
ConsumerAndLibrary(consumer=Consumer(name=小明, age=18, address=null), library=Library(libraryName=歌曲4, consumerId=1))
ConsumerAndLibrary(consumer=Consumer(name=小黑, age=28, address=null), library=Library(libraryName=歌曲5, consumerId=2))
ConsumerAndLibrary(consumer=Consumer(name=小白, age=38, address=null), library=Library(libraryName=歌曲6, consumerId=3))

一对多

//一对多关联
data class ConsumerAndLibrarys(@Embeddedvar consumer: Consumer,@Relation(parentColumn = "id", entityColumn = "consumerId")var library: List<Library>
)
//Dao//一对多查询
@Transaction
@Query("SELECT * FROM Consumer")
fun getConsumerAndLibrarysList(): List<ConsumerAndLibrarys>

查询操作:

val consumerAndLibrarysList =
MyRoomDatabase.getDatabase(this).libraryDao().getConsumerAndLibrarysList()
for (i in consumerAndLibrarysList) {log(i)
}
ConsumerAndLibrarys(consumer=Consumer(name=小明, age=18, address=null), library=[Library(libraryName=歌曲1, consumerId=1), Library(libraryName=歌曲4, consumerId=1)])
ConsumerAndLibrarys(consumer=Consumer(name=小黑, age=28, address=null), library=[Library(libraryName=歌曲2, consumerId=2), Library(libraryName=歌曲5, consumerId=2)])
ConsumerAndLibrarys(consumer=Consumer(name=小白, age=38, address=null), library=[Library(libraryName=歌曲3, consumerId=3), Library(libraryName=歌曲6, consumerId=3)])

数据库升级

  • Room会触发所有迁移策略,一个接着一个执行

新增表

新建Entity类

@Entity
data class Book(var name: String, var pages: Int) {@PrimaryKey(autoGenerate = true)var id = 0L}

配置升级信息

private const val DB_NAME = "myroom"
private const val DB_VERSION = 2@Database(version = DB_VERSION, entities = [User::class, Book::class])
abstract class MyRoomDatabase : RoomDatabase() {companion object {private var instance: MyRoomDatabase? = null//版本1升级到版本2策略private val updateVersion_1_2 = object : Migration(1, 2) {override fun migrate(database: SupportSQLiteDatabase) {val sql ="create table Book(id integer primary key autoincrement not null, name text not null, pages integer not null)"database.execSQL(sql)}}@Synchronizedfun getDatabase(context: Context): MyRoomDatabase {instance?.let {return it}return Room.databaseBuilder(context.applicationContext,MyRoomDatabase::class.java,DB_NAME).addMigrations(updateVersion_1_2).build().apply {instance = this}}}}

新增表字段

修改配置类

private const val DB_NAME = "myroom"
private const val DB_VERSION = 3@Database(version = DB_VERSION, entities = [User::class, Book::class])
abstract class MyRoomDatabase : RoomDatabase() {companion object {private var instance: MyRoomDatabase? = null//版本1升级到版本2策略private val updateVersion_1_2 = object : Migration(1, 2) {override fun migrate(database: SupportSQLiteDatabase) {val sql ="create table Book(id integer primary key autoincrement not null, name text not null, pages integer not null)"database.execSQL(sql)}}//版本2升级到版本3private val updateVersion_2_3 = object : Migration(2, 3) {override fun migrate(database: SupportSQLiteDatabase) {val sql = "alter table Book add column info text not null default 'unknown'"database.execSQL(sql)}}@Synchronizedfun getDatabase(context: Context): MyRoomDatabase {instance?.let {return it}return Room.databaseBuilder(context.applicationContext,MyRoomDatabase::class.java,DB_NAME).addMigrations(updateVersion_1_2, updateVersion_2_3).build().apply {instance = this}}}}

修改Entity类

@Entity
data class Book(var name: String, var pages: Int, var info: String) {@PrimaryKey(autoGenerate = true)var id = 0L}

源码下载

Jetpack Room相关推荐

  1. 【TX2】安装NVIDIA SDK Manager(JetPack 4.6)后,下载kernel和u-boot源码

    1.先确认版本号 官网:L4T 32.6.1 is included as part of JetPack 4.6 2.下载源码 执行同步代码命令: ~/nvidia/nvidia_sdk/JetPa ...

  2. Android Jetpack架构组件之 Room(使用、源码篇)

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发 ...

  3. 深圳腾讯内部Jetpack宝典意外流出!极致经典,堪称Android架构组件的天花板

    简介 Jetpack是一套库.工具和指南,可以帮助开发者更轻松地编写优质应用.这些组件可以帮助开发者遵循最佳做法.让开发者摆脱编写样板代码的工作并简化复杂任务,以便开发者将精力集中放在所需的代码上. ...

  4. Android JetPack Lifecycle源码解析

    是什么? JetPack Lifecycle是一个页面(Activity/Fragment)生命周期的组件,当你想监听生命周期,那么就可以使用这个组件. 怎么用? 第一种: getLifecycle( ...

  5. Android Jetpack组件之Hilt使用

    前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. And ...

  6. Android Jetpack组件App Startup简析

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  7. Android Jetpack组件之WorkManger使用介绍

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  8. Android Jetpack组件之Navigation使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  9. Android Jetpack组件之 Room使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  10. Android Jetpack组件之 Paging使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

最新文章

  1. DS, ES, SS, DI, SI, BP, SP, IP, FS 寄存器
  2. ubuntu16.04系统下创建python隔离环境
  3. JIRA配置手册 (3):字段和界面
  4. mybatis转义反斜杠_Shell echo命令:输出字符串
  5. SQLServer之创建唯一聚集索引
  6. 字符串按照单词为单位逆序排列
  7. 黔南民族师范学院计算机与信息学院,黔南民族师范学院
  8. yum配置(源配置-光驱,ftp服务器;基本用法)
  9. 改进后的新String类
  10. uniapp 如何给搜索框设值_uni-app 顶部配置搜索框和左右图标
  11. 通俗易懂的信息熵与信息增益(IE, Information Entropy; IG, Information Gain)
  12. 处理字符数据--排序规则(Collation)
  13. 05.日志框架与Spring Boot日志全篇
  14. SAP PK Oracle
  15. win7+VS2008安装QT、环境配置以及简单实例演示
  16. 用cmd打开jar文件
  17. web前端开发期末大作业 ——个人主页(可自取源码)
  18. 如虎添翼 7 个转场技巧
  19. Firefox修改快捷键插件SakaKey使用教程
  20. Redisson(1)分布式锁——如何解决死锁问题

热门文章

  1. 疫情“放大”了无人配送的价值
  2. java小程序发送模板消息
  3. 数据结构——数组以及n维数组
  4. linux内核ddr初始化,嵌入式Linux裸机开发(五)——SDRAM初始化
  5. python爬虫01-get请求,post请求,参数拼接,re正则解析,bs解析,xpath解析xml及html文件,requests进阶模拟登录,反盗链zhuanqu,代理
  6. 实用计算机理论基础知识试题及答案,计算机基础知识试题库及答案(5)
  7. python什么字体好看_python docx 中文字体设置的操作方法
  8. 常见负载均衡服务器介绍
  9. MediaCodec编码后视频时长不正确的问题
  10. 扫地机器人的喋血江湖