关于我测试出了一个日常应该碰不到的 sqlite 问题

查看 15|回复 0
作者:magic3584   
场景复现
[ol]
  • 手机上安装版本 1 的 app
  • 通过 Testflight 安装版本 2 ,数据都还在
  • App Store 安装版本 1 ,数据还在
  • 通过 Testflight 安装版本 2 ,数据没了(其实 db 还在)
    [/ol]
    当时凌晨 1 点多了,我刚提交审核,本来测试了前 3 步,我想着睡觉前再测一下更新问题,结果发现页面都空了。
    作为一个本地数据存储的 app ,这是个致命的 bug 。于是我赶紧撤销了审核申请。
    问题排查
    前两步正常更新没问题,后面第 4 步发现页面空了。
    由于 iPhone 没有越狱,看不到里面文件。于是我重复前 3 步,然后用 debug 安装版本 2 ,果然发现了问题。
    版本 2 里我新增了字段ALTER TABLE table ADD COLUMN columnName,然后第四步的时候,由于是从版本 1 安装的,所以还会执行 db update 操作,这个 sql 报错Column is exsit 导致数据库关闭,所以页面没数据。Xcode 导出包内容后,db 文件都还在。
    解决办法
    问了 chatGPT ,它说 sql 应该这么写ALTER TABLE your_table ADD COLUMN IF NOT EXISTS new_column_name data_type; ,但是,运行的时候提示语法有问题,查了一下,sqlite 不支持这个语法😂 chatGPT 你真会玩。
    但是,因为语法问题导致 sql 执行失败,数据库竟然能打开,我???
    最后在执行 sql 的时候 try catch ,最起码不会打不开数据库了(之前没加是因为我觉得 sql 不会有问题)
    讨论
    为什么说这个 sqlite 问题日常碰不到呢,因为众所周知只能下最新版本的 app ,所以不会有在不同版本之间切换的操作。为了不让数据丢失,每次发版都小心翼翼的,这次真的吓到我了。
    但是这里面的原理是什么呢?数据库版本降了字段不会自动删除吗?你们有碰到过哪种 sql 的问题呢?
    请大佬指点
  • 您需要登录后才可以回帖 登录 | 立即注册

    返回顶部