大型 Android 系统重构实战
黄俊彬
Thoughtworks 资深咨询师
2840 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
大型 Android 系统重构实战
15
15
1.0x
00:00/00:00
登录|注册

17|框架升级:如何小步安全地升级数据库框架?

你好,我是黄俊彬。
上节课我们重构了消息组件,最后遗留了一个问题,就是消息组件的数据存储都是采用 SQL 拼写的方式来操作,这样不便于后续的扩展及维护。
除此之外,相比前面的其他重构,升级数据框架需要考虑的场景会更多,例如升级框架以后用户的重要数据不能丢失。
今天我们以 Sharing 项目为例,一起把项目中原先采用 SQL 拼写的方式替换为使用 Room 框架来统一管理缓存数据。在这个过程中我会与你分享如何小步安全重构,分阶段完成数据库框架的升级。为了确保重构完的代码不会破坏原有功能,还有用户的关键数据不丢失,我还会讲解如何给数据操作相关功能做自动化测试覆盖,以及如何实现更安全的数据迁移。

代码分析

我们先一起来看看消息组件中创建数据库表的相关操作,核心代码是后面这样。
//数据库表的创建
class DataBaseHelper(context: Context?) : SQLiteOpenHelper(context, "message.db", null, 1) {
override fun onCreate(db: SQLiteDatabase) {
createTable(db)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {}
fun createTable(db: SQLiteDatabase) {
val createTableSql = """CREATE TABLE IF NOT EXISTS $message_info(
$id INTEGER PRIMARY KEY AUTOINCREMENT,
$content VARCHAR(1024) ,
$fileName VARCHAR(1024) ,
$date LONG
)"""
try {
db.execSQL(createTableSql)
} catch (e: Exception) {
Log.d("Task:Sql", e.message!!)
}
}
companion object {
var message_info = "message_info"
var id = "id"
var content = "content"
var fileName = "fileName"
var date = "date"
}
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何安全地升级数据库框架,并在升级过程中进行自动化测试覆盖和小步安全重构。通过以Sharing项目为例,作者分析了原有的数据库操作代码存在的问题,并介绍了使用Room框架管理缓存数据的升级过程。文章强调了自动化测试覆盖和小步重构的重要性,并提供了测试用例的设计和自动化测试用例的代码示例。作者还详细阐述了小步安全重构的步骤,包括使用Room注解更新实体、使用Room的SupportSQLiteOpenHelper进行SQL操作、使用Dao注解管理数据的增删改查以及数据迁移等。最后,总结了Room框架的升级带来的优势,如减少模板代码编写、代码更易维护等。整体而言,本文通过具体的代码示例和步骤说明,为读者提供了一种安全升级数据库框架的方法,并强调了自动化测试覆盖和小步重构的重要性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《大型 Android 系统重构实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • peter
    请教老师两个问题: Q1:屏幕适配一般怎么做?采用框架?如采用,什么框架好?还是逐页面来做?不采用框架的话,布局时控件宽高都用weight,距离用dp,字体用sp,这样就可以适配吗? Q2:MessageDao的定义中,@Insert后面为什么没有SQL语句?另外,Delete函数的注解写的是@Query,应该是笔误吧。

    作者回复: Hi,peter。 Q1:适配大屏,通常采用多布局文件的方式。 Q2:Insert注解表示插入数据,不用SQL语句,后面的Delete由于是要删除所有数据,Delete注解不支持,所以用了Query。

    2023-03-20归属地:山西
  • Aā 阳~
    老师,可以解释一下思考题吗
    2023-10-12归属地:上海
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部