Jetpack Room
文章目录
- 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相关推荐
- 【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 ...
- Android Jetpack架构组件之 Room(使用、源码篇)
2019独角兽企业重金招聘Python工程师标准>>> 1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发 ...
- 深圳腾讯内部Jetpack宝典意外流出!极致经典,堪称Android架构组件的天花板
简介 Jetpack是一套库.工具和指南,可以帮助开发者更轻松地编写优质应用.这些组件可以帮助开发者遵循最佳做法.让开发者摆脱编写样板代码的工作并简化复杂任务,以便开发者将精力集中放在所需的代码上. ...
- Android JetPack Lifecycle源码解析
是什么? JetPack Lifecycle是一个页面(Activity/Fragment)生命周期的组件,当你想监听生命周期,那么就可以使用这个组件. 怎么用? 第一种: getLifecycle( ...
- Android Jetpack组件之Hilt使用
前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. And ...
- Android Jetpack组件App Startup简析
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack组件之WorkManger使用介绍
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack组件之Navigation使用-源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack组件之 Room使用-源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack组件之 Paging使用-源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
最新文章
- DS, ES, SS, DI, SI, BP, SP, IP, FS 寄存器
- ubuntu16.04系统下创建python隔离环境
- JIRA配置手册 (3):字段和界面
- mybatis转义反斜杠_Shell echo命令:输出字符串
- SQLServer之创建唯一聚集索引
- 字符串按照单词为单位逆序排列
- 黔南民族师范学院计算机与信息学院,黔南民族师范学院
- yum配置(源配置-光驱,ftp服务器;基本用法)
- 改进后的新String类
- uniapp 如何给搜索框设值_uni-app 顶部配置搜索框和左右图标
- 通俗易懂的信息熵与信息增益(IE, Information Entropy; IG, Information Gain)
- 处理字符数据--排序规则(Collation)
- 05.日志框架与Spring Boot日志全篇
- SAP PK Oracle
- win7+VS2008安装QT、环境配置以及简单实例演示
- 用cmd打开jar文件
- web前端开发期末大作业 ——个人主页(可自取源码)
- 如虎添翼 7 个转场技巧
- Firefox修改快捷键插件SakaKey使用教程
- Redisson(1)分布式锁——如何解决死锁问题
热门文章
- 疫情“放大”了无人配送的价值
- java小程序发送模板消息
- 数据结构——数组以及n维数组
- linux内核ddr初始化,嵌入式Linux裸机开发(五)——SDRAM初始化
- python爬虫01-get请求,post请求,参数拼接,re正则解析,bs解析,xpath解析xml及html文件,requests进阶模拟登录,反盗链zhuanqu,代理
- 实用计算机理论基础知识试题及答案,计算机基础知识试题库及答案(5)
- python什么字体好看_python docx 中文字体设置的操作方法
- 常见负载均衡服务器介绍
- MediaCodec编码后视频时长不正确的问题
- 扫地机器人的喋血江湖