Room

  1. SQL基础上的一个抽象层

使用

  1. 引入依赖
def room_version = "2.4.3"
implementation "androidx.room:room-runtime:$room_version"
// To use Kotlin annotation processing tool (kapt)
kapt "androidx.room:room-compiler:$room_version"
implementation("androidx.room:room-ktx:$room_version")
  1. 定义数据库表
    使用@Entity注解
@Entity(tableName = "User")
class User {@PrimaryKeyvar id: Int = 0@ColumnInfo(name = "name")var name: String = ""@ColumnInfo(name = "address", defaultValue = "")var address: String = ""
}
  1. 定义数据表操作接口
    使用@Dao注解
@Dao
interface UserDao {@Insert(onConflict = OnConflictStrategy.REPLACE)suspend fun insert(user: User)@Query("select * from user")fun getAll() : Flow<List<User>>}
  1. 定义数据库接口
    使用@Database注解
@Database(// entities可以维护多个class,代表多张数据库表entities = [User::class],version = 1,
)
abstract class UserDataBase : RoomDatabase() {// 返回数据库访问接口abstract fun userDao(): UserDaocompanion object {private var userDataBase: UserDataBase? = nullfun get(context: Context): UserDataBase {return userDataBase ?: synchronized(this) {// lcj为数据库名Room.databaseBuilder(context, UserDataBase::class.java, "lcj").build().also {userDataBase = it}}}}}
  1. 使用
class UserViewModel(app:Application) : AndroidViewModel(app) {suspend fun insert(id: Int, name: String, address: String) {val user = User()user.id = iduser.name = nameuser.address = addressUserDataBase.get(getApplication()).userDao().insert(user)}fun getAll(): Flow<List<User>> {return UserDataBase.get(getApplication()).userDao().getAll().catch {}.flowOn(Dispatchers.IO)}
}

迁移

自动迁移

使用自动迁移,需要提供schema.location配置且@DataBase中的exportSchema必须设置为TRUE(默认为TRUE)

  1. build.gradle中进行如下配置,用于生成每个版本的数据库记录,Room用来跟踪数据库的变更
    defaultConfig {kapt {arguments {arg("room.schemaLocation", "$projectDir/schemas")}}}
  1. 新增列address
@Entity(tableName = "User")
class User {@PrimaryKeyvar id: Int = 0@ColumnInfo(name = "name")var name: String = ""// 版本2新增字段@ColumnInfo(name = "address", defaultValue = "")var address: String = ""
}
  1. 在Database注解中version升级到对应版本,且autoMigrations添加from to
@Database(// entities可以维护多个class,代表多张数据库表entities = [User::class],// 修改版本号version = 2,// 新增自动迁移autoMigrations = [AutoMigration(from = 1, to = 2)]
)
abstract class UserDataBase : RoomDatabase() {
  1. 生成的跟踪文件如下

注意:上面步骤,完成数据库中添加一列的升级。每当数据库版本再次改变时,您只需更新 autoMigrations 列表,添加一个新的AutoMigration即可。上述数据库表中新增了address列,对于自动迁移,Room自动会检测中这种变更,不需要开发者做其他操作。
但是,有些自动迁移操作,Room无法检测出变化,需要开发者添加额外的spec,如,修改表名、列名、删除表、删除列,需要添加如下代码
@DeleteTable(tableName)
@RenameTable(fromTableName, toTableName)
@DeleteColumn(tableName, columnName)
@RenameColumn(tableName, fromColumnName, toColumnName)
下面代码是从版本2升级到版本3,用于修改列名,此处在AutoMigration中添加了spec

@Database(// entities可以维护多个class,代表多张数据库表entities = [User::class],version = 3,autoMigrations = [AutoMigration(from = 1, to = 2),AutoMigration(from = 2, to = 3, spec = UserDataBase.Migration2to3::class)]
)
abstract class UserDataBase : RoomDatabase() {abstract fun userDao(): UserDao@RenameColumn(tableName = "User", fromColumnName = "address", toColumnName = "addressAt")class Migration2to3 : AutoMigrationSpec
手动迁移

针对手动,Room 提供了 Migration 类。每当您要更改复杂的数据库时,您就得使用这个类。如:将数据库中的一个表拆分成两个不同的表,Room 无法检测到拆分的执行过程,也不能自动检测到需要移动的数据。因此这个时候,您需要实现一个 Migration 类,并通过 addMigrations() 的方法将其添加至 databaseBuilder() 中。

companion object {private var userDataBase: UserDataBase? = null// 手动迁移private val migration = object : Migration(2, 3) {override fun migrate(database: SupportSQLiteDatabase) {// 在这里进行手动迁移操作}}fun get(context: Context): UserDataBase {return userDataBase ?: synchronized(this) {// lcj为数据库名Room.databaseBuilder(context, UserDataBase::class.java, "lcj")// 使用addMigrations添加自动迁移.addMigrations(migration).build().also {userDataBase = it}}}}

Android-Room使用和迁移相关推荐

  1. android androidx版本,Android AndroidX 简介与迁移

    AndroidX 简介 AndroidX 是 Android 团队用于在 Jetpack 中开发,测试,打包,版本和发布库的开源项目 . AndroidX 是对原始 Android Support L ...

  2. android circleimageview 导入到eclipse,android项目从Eclipse迁移到Android studio中常见问题解决方法.pdf...

    android项项目目从从Eclipse迁迁移移到到Android studio 中中常常见见问问题题解解决决方方法法 android项目从Eclipse迁移到Android studio中经常会遇到 ...

  3. 未越狱iphone与 Android短信备份迁移攻略

    本攻略的原理简单,对小白们操作麻烦,对自己会越狱的同学,又是鸡肋.为了昨天熬夜到2点的辛苦,还是抽出时间写写.        转载自己搬,无需通知本人.        现在许多软件都能实现通讯录和短信 ...

  4. 记录Android修改报名顺便迁移androidx

    修改包名: 我的方法不是正经方法..不能完全修改包名.. 1.修改app的build.gradle 的applicationId ,然后sync一下 ,接着把项目用到的一些配置文件里面哪里有用到pac ...

  5. Android 制定安装重写迁移至SD卡 APP2SD

    /********************************************************** 大家都知道写博客会很累的,希望 转载请注明出处:http://blog.csdn ...

  6. 从 Eclipse 迁移至 Android Studio

    从 Eclipse 迁移至 Android Studio 本文内容 Android Studio 基础知识 迁移先决条件 将项目导入 Android Studio 后续步骤 将项目迁移至 Androi ...

  7. Android实战技巧之十一:Android Studio和Gradle

    2019独角兽企业重金招聘Python工程师标准>>> 经过两个多月的AS体验,我认为是时候将Android的开发环境迁移到AS上了.目前最新版本是1.0.2(大年30当天升级到1. ...

  8. Android Studio vs Eclipse:你需要知道的那些事

    转用Android Studio开发前,你需要知道 我写的这个指引里,包含了一些当你要把Eclipse项目转到Andorid Studio前需要知道的基本信息.如果你有一个大型项目还没完成从Eclip ...

  9. android中自适应布局教程,Android自适应布局设计技巧

    由于目前在做的一款app需要适配手机和平板,所以我在研究怎么构建可适应所有屏幕尺寸的布局方法. 在web的自适应布局上我有很多经验,比如使用网格流,CSS3中的media queries属性等等,这些 ...

  10. 【Android 命令行工具】Android 命令行工具简介 ( 官方文档 | SDK 命令行工具 | SDK 构建工具 | SDK 平台工具 | 模拟器工具 | Jetifier 工具 )

    文章目录 一.官方文档 二.Android 命令行工具简介 1.SDK 命令行工具 2.SDK 构建工具 3.SDK 平台工具 4.模拟器工具 5.Jetifier 工具 一.官方文档 Android ...

最新文章

  1. java 用户登录token_Java,SpringBoot采用token方式实现登录认证
  2. 向量几何在游戏编程中的使用系列二之2-D物体间的碰撞响应
  3. 010 使用list和tuple
  4. java网络篇-tcp的握手和挥手!
  5. OSPF高级特性——LSA-3(Network Summary LSA)的过滤、路由协议——管理距离的修改、外部路由的metric值的修改
  6. 毕业生该不该做软件开发这一行?
  7. Struts2中访问web元素
  8. 排序函数c语言流程图,各种排序的流程图 大家帮忙弄一下
  9. 放弃 PHP,选择 Node.JS 的 8 个理由!
  10. 优化理论03----优化导论和无约束问题的最优条件、优化问题的类型、局部、全局和严格优化、梯度和Hessian 黑塞矩阵和方向导数、无约束问题的最优条件
  11. Win10下Matlab r2018a 64位 中文破解版的安装以及破解方法
  12. 音乐计算机研修心得,音乐学习心得体会五篇
  13. python getcwd_Python3 os.getcwd() 方法
  14. 无线AP(Access Point)是什么
  15. 教你如何制作浪漫的表白网站
  16. Calculate a+b
  17. Python网络爬虫实战之爬取小说
  18. Windows使用AnyProxy抓包(详细)
  19. DNN摸索系列1:DNN 6 如何添加新皮肤包
  20. android开发资料!4年小Android的心路历程,附大厂真题面经

热门文章

  1. 探索创建InitialContext过程
  2. 入驻CSDN博客心情
  3. 话说现实的搞笑幽默短信
  4. android ToggleButton
  5. html css js项目总结-官网
  6. (实况野球)恶灵学院(ダンジョン高校)二周目攻略
  7. 国内composer更新源
  8. [附源码]SSM计算机毕业设计家居装修网站JAVA
  9. dockerfile镜像构建命令
  10. mysql通配符查询字段名_mysql通配符如何查询字段