Jetpack:Room数据库升级详解实战!,retrofit面试

}

以此类推,如果需要将数据库由2升级到3,则进行如下的声明。

private val MIGRATION_2_3 = object :Migration(2,3){

override fun migrate(database: SupportSQLiteDatabase) {

//执行与数据库升级相关的操作

}

}

如果当前用户的数据库时1,直接安装了升级到3版本的应用,那么此时Room会按照顺序先后执行Migration(1,2)、Migration(2,3)以完成升级

最后,通过addMigration将升级方案加入到room中。

Room.databaseBuilder(

AppUtil.application,

StudentDataBase::class.java,

STUDENT_DB_NAME

)

.addMigrations(MIGRATION_1_2,MIGRATION_2_3)

.build()

异常处理

=======================================================================

如果我们将数据库升级到了3,但是缺没有写对应的migration,那么使用的时候room直接回抛出IllagelStateException。因为Room在升级过程中没有匹配到相应的Migration。为了防止出现升级失败导致应用程序崩溃的情况,可以在创建数据库时加入fallbackToDestructiveMigration()方法。该方法能够在出现升级异常时,重新创建数据表。**需要注意的是,虽然应用程序不会崩溃,但由于数据表被重新创建,所有的数据也将会丢失。**如下所示:

Room.databaseBuilder(

AppUtil.application,

StudentDataBase::class.java,

STUDENT_DB_NAME

)

.addMigrations(MIGRATION_1_2,MIGRATION_2_3)

.fallbackToDestructiveMigration()

.build()

实战

=====================================================================

本例子基于前面预先创建好的学生数据库表,进行两次升级,第一次升级增加Fruit表,第二次在Fruit表中新增字段。可参考Jetpack:Room超详细使用踩坑指南!Jetpack:Room配合LiveData/Flow使用优化,Room+Flow使用原理解析。

1.创建Fruit表实体类

@Entity(tableName = FRUIT_TABLE_NAME)

data class FruitEntity(

@PrimaryKey(autoGenerate = true)

@ColumnInfo(name = FRUIT_TABLE_ID)

val id: Int = 0,

@ColumnInfo(name = FRUIT_TABLE_TEXT)

val text: String?

)

/**

  • 表名字相关,统一定义.

*/

const val FRUIT_TABLE_NAME = “fruit”

const val FRUIT_TABLE_ID = “fruit_id”

const val FRUIT_TABLE_TEXT = “fruit_name”

2.在数据升级的声明的Database注解中,新加入Fruit实体类,升级版本为2。

//之前

@Database(entities = arrayOf(StudentEntity::class), version = 1)

abstract class StudentDataBase : RoomDatabase()

//新增FruitEntity实体类 升级版本号

@Database(entities = arrayOf(StudentEntity::class,FruitEntity::class), version = 2)

abstract class StudentDataBase : RoomDatabase()

3.新增migration,同事设置进addMigration方法。

/**

  • 数据库升级 1 到 2

*/

private val MIGRATION_1_2 = object :Migration(1,2){

override fun migrate(database: SupportSQLiteDatabase) {

//新增 FRUIT 表

database.execSQL(“CREATE TABLE IF NOT EXISTS $FRUIT_TABLE_NAME ($FRUIT_TABLE_ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, $FRUIT_TABLE_TEXT TEXT)”)

}

}

//修改数据库声明,将MIGRATION_1_2 设置进addMigrations

fun getDataBase(): StudentDataBase {

return INSTANT ?: synchronized(this) {

INSTANT ?: Room.databaseBuilder(

AppUtil.application,

StudentDataBase::class.java,

STUDENT_DB_NAME

).addMigrations(MIGRATION_1_2)

.fallbackToDestructiveMigration()

.build()

.also {

INSTANT = it

}

}

}

写Dao接口,测试:

@Dao

interface ConflateDao {

@Query(“select * from $FRUIT_TABLE_NAME”)

suspend fun obtainFruit() : List

@Insert

suspend fun insertFruit(fruitEntity: FruitEntity)

}

//StudentDataBase中获取Dao

abstract fun getConflateEntityDao():ConflateDao

//activity 测试代码

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2020年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包阅读下载,最后觉得有帮助、有需要的朋友可以点个赞

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 Room 数据库升级,您需要遵循以下步骤: 1. 在新版本的数据库中定义新表结构或对旧表结构进行更改,例如添加、删除或修改表的列。 2. 在您的 `AppDatabase` 类中增加数据库版本号,可以在类上使用 `@Database` 注解指定版本号,例如: ```kotlin @Database(entities = [User::class], version = 2) abstract class AppDatabase : RoomDatabase() { //... } ``` 3. 创建一个实现 `Migration` 接口的类,该类将包含从旧版本升级到新版本所需的所有更改。例如: ```kotlin val migration_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE users ADD COLUMN age INTEGER NOT NULL DEFAULT 0") } } ``` 该示例代码表示,从版本 1 升级到版本 2,需要在 `users` 表中添加一个名为 `age` 的整数类型的列。 4. 在 `AppDatabase` 类中,使用 `addMigrations()` 方法将 `Migration` 对象添加到数据库中,例如: ```kotlin @Database(entities = [User::class], version = 2) abstract class AppDatabase : RoomDatabase() { //... companion object { val migration_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE users ADD COLUMN age INTEGER NOT NULL DEFAULT 0") } } } //... init { if (BuildConfig.DEBUG) { // 在调试模式下,如果发现数据结构变化,将会清空数据 fallbackToDestructiveMigration() } else { // 在正式发布模式下,如果发现数据结构变化,将会执行升级脚本 addMigrations(migration_1_2) } } } ``` 在上述示例代码中,我们将 `migration_1_2` 对象添加到 `AppDatabase` 类的伴生对象中,并在 `init` 块中进行了初始化。我们还使用了 `fallbackToDestructiveMigration()` 方法,如果在调试模式下发现数据结构变化,将会清空数据。在正式发布模式下,我们使用了 `addMigrations()` 方法,将 `migration_1_2` 对象添加到数据库中,以执行升级脚本。 这样,在您的应用程序使用新版本的数据库时,将自动执行升级脚本,以将旧数据结构转换为新数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值