当时凌晨 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 的问题呢?
请大佬指点
1
codehz 2023-12-29 10:17:42 +08:00 via iPhone
|
2
magic3584 OP @codehz #1
主要是不太理解里面原理。而且我看到 sqlite 有个 ondowngrade 的默认实现,幸亏我看了一眼,原来默认是删数据。。。 |
3
kneo 2023-12-29 11:24:27 +08:00
数据库的表结构和数据都是数据,app 升级降级修改的是代码,数据还是原来的数据,除非你在代码里做了数据迁移。不可能说你用旧数据库代码会自动删除新 column 。
|
5
kneo 364 天前 via Android
|
6
magic3584 OP @kneo #5
我目前都是把每条 sql 语句放在数组里,然后在升级的时候去循环执行。 sqlite 竟然不支持 ADD COLUMN IF NOT EXISTS 这种。如果执行多条 sql 的话,就只能在循环里加方法了。。。 |
7
kneo 363 天前
每个数据库都不一样,不支持是很正常的。
|
8
julyclyde 362 天前
为什么会爆 is exsit 呢?
难道不是应该 does exist 吗?? |