当在更新项目过程中遇到新增数据库字段,此时需同步数据库操作,更改目标类:

@Database(entities = [Bean::class], version = 1, exportSchema = false)
@TypeConverters(DateAdapters::class)
abstract class AppDatabase : RoomDatabase() {companion object {private const val TAG = "AppDatabase"private const val DATABASE_NAME = "mvvm_database"fun initialize(@ApplicationContext context: Context): AppDatabase {return Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME).apply {fallbackToDestructiveMigration()}.build()}}abstract fun beanDao(): BeanDao}

#1. 简单粗暴的操作:对于更新数据库操作,直接更改版本号:version (大于原来的值即可,+1即可):

@Database(entities = [Bean::class], version = 2, exportSchema = false)

⚠️ 如果没有提供足够的迁移来从当前版本移动到最新版本,Room 将清除数据库并重新创建。对于 #1,因为仅仅更新了版本号升级,所以Room会把本地的数据库清除并创建,即本地数据库的数据将会丢失,这并不是推荐的操作。

#2. 基于 #1 的更改,继续为数据库创建迁移脚本 addMigrations() ,在表级别进行适当的更改以支持同步数据库字段新增:

@Database(entities = [Bean::class], version = 2, exportSchema = false)
@TypeConverters(DateAdapters::class)
abstract class AppDatabase : RoomDatabase() {companion object {private const val DATABASE_NAME = "mvvm_database"fun initialize(@ApplicationContext context: Context): AppDatabase {return Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME).apply {fallbackToDestructiveMigration()addMigrations(MIGRATION_1_2)}.build()}// 如果数据库有改动,则需要更新数据库版本来同步更新数据库,以下为示例方法:private val MIGRATION_1_2 = object : Migration(1, 2) {override fun migrate(database: SupportSQLiteDatabase) {database.execSQL("ALTER TABLE Bean ADD COLUMN `deletedDate` INTEGER")database.execSQL("ALTER TABLE Bean ADD COLUMN `isDeleted` INTEGER NOT NULL DEFAULT 0")}}}abstract fun beanDao(): BeanDao}

⚠️ Room会根据提供的迁移脚本Migration来从当前版本移动到最新版本,Room 并不会清除数据库并重新创建。

ADD COLUMN还需要注意一点在非空字段的时候:
Android Room- 为表新增非空字段时报错

* 补充:如果只对当前表进行字段更新,又对本地数据没有什么要求,我们可以先删除相应的表,再创建新表:(这适用于所有的表字段更新)

        private val MIGRATION_1_2 = object : Migration(1, 2) {override fun migrate(database: SupportSQLiteDatabase) {database.execSQL("DROP TABLE IF EXISTS Bean")database.execSQL("CREATE TABLE IF NOT EXISTS `Bean` (`id` INTEGER NOT NULL, `checksum` TEXT NOT NULL, `deletedDate` INTEGER, `isDeleted` INTEGER NOT NULL, PRIMARY KEY(`id`))")}}

Android Room 升级数据库-增加字段相关推荐

  1. android连接SQLite数据库-----增加改查+分页

    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 ...

  2. 数据库增加字段加备注

    alter table 表名 add (字段名 字段类型 ); COMMENT ON COLUMN 表名.字段名 IS '备注信息';

  3. Android基础知识 - SQLite数据库的最佳实践(使用事务、升级数据库的最佳写法)

    目录 使用事务 升级数据库的最佳写法 使用事务 SQLite数据库时支持事务的,事务的特性可以保证让某一系列的操作要么全部完成,要么一个都不会完成. 那么在什么情况下才需要使用事务呢? 想象以下场景, ...

  4. Android入门(十二)SQLite事务、升级数据库

    原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...

  5. mysql数据库制定位置_MySQL数据库在指定位置增加字段

    这个本身属于MySQL的基本语法,我这里给出一个例子而已. mysql> -- 测试数据库在指定位置增加字段 mysql> drop table if exists t; Query OK ...

  6. android数据库升级兼容老版本吗,成功升级后Android升级数据库不更新数据库版本...

    我想添加三个新表到我现有的sqlite数据库,我遇到了成功升级后不更新数据库版本的问题.下面是运行DatabaseHelper:成功升级后Android升级数据库不更新数据库版本 private st ...

  7. oracle删除表的一个字段的数据库,学会Oracle数据库删除表字段和Oracle数据库表增加字段方法...

    Oracle数据库添加字段的语法:alter table tablename add (column datatype [default  value][null/not null],-.); Ora ...

  8. mysql增加布尔字段_JDBC对MySQL数据库布尔字段的操作方法

    本文实例讲述了JDBC对MySQL数据库布尔字段的操作方法.分享给大家供大家参考.具体分析如下: 在Mysql数据库如果要使用布尔字段,而应该设置为BIT(1)类型 此类型在Mysql中不能通过MyS ...

  9. oracle数据库建表、修改字段名称类型、增加字段、ID自动增长写法

    oracle建表: create table INDEX_POLICY_TBL       (        ID NUMBER(10) NOT NULL PRIMARY KEY,        PO ...

  10. android dbflow教程,Android高性能ORM数据库DBFlow入门教程

    一.引入依赖.初始化 需要引入apt和maven,配置项目的 build.gradle buildscript { repositories { jcenter() } dependencies { ...

最新文章

  1. oracle10g資料庫調效,資料庫 | 簡睿隨筆 | 學習過程的紀錄與備忘
  2. leetcode 35. 搜索插入位置
  3. mysql数据库保存中文乱码解决参考方案
  4. pthread-win32 semaphore信号量总结
  5. 全球及中国水产养殖和畜牧保险行业风险研究与“十四五”投资建议报告2021年版
  6. VTK:可视化之Follower
  7. (二)docker安装并持久化postgresql数据库
  8. python-字典方法
  9. Ts_半分查找猜数字游戏(初始版),
  10. 信息奥赛一本通(1120:同行列对角线的格)
  11. 新视角:用图像分类来建模文字识别也可以SOTA
  12. ubuntu安装禅道
  13. Vue与class和style
  14. 《万物互联》——1.3 什么样的物体可以接入物联网
  15. flume流程之http-memory-hdfs
  16. 翻译:响应式编程或反应式编程 RxSwift和RxCocoa 从入门到精通 Reactive programming
  17. 易语言怎么给手机发短信,对接验证码短信接口DEMO示例
  18. rtk定位权限_无人机中的GPS定位、DGPS差分定位、RTK差分定位
  19. 英语四级——常考语法【不断更新中】
  20. python 语料_用python从语料库中提取最常用的词

热门文章

  1. web网页设计实例作业 我的家乡- 达州(4页) HTML+CSS+JavaScript dreamweaver作业静态HTML网页设计模板
  2. socket程序退出后端口依然被占用问题的解决
  3. 系列学习 Gateway 之第 4 篇 —— 网关限流
  4. 机器学习十大算法!入门看这个就够了~
  5. 哔哩哔哩服务器在哪个文件夹,哔哩哔哩在手机哪个文件夹
  6. matlab 转移矩阵,matlab转移矩阵
  7. 计算机技术 安防 工程师考试,2020年上半年信息安全工程师考试报考指南
  8. 那些年,我们一起做过的KNX智能化控制经典案例!
  9. 【AI面试题】随机森林算法的原理、随机性、优缺点
  10. Linux消息队列讲解