在我的Android应用程序中,我使用的是一个标准的SQLite数据库,其中一个帮助类有一个包含3列的表。在最近的更新中,我不得不在表中添加另一列,但是有些用户报告了崩溃,其中(根据堆栈跟踪判断)我认为来自新版本试图从不存在的列读取因为数据来自旧版本。除了手动备份和还原之外,如何在更新之间保护用户数据?
以下是完整更新的数据库类的链接: https://github.com/cjbrooks12/scripturememory/blob/working/src/com/caseybrooks/scripturememory/databases/VersesDatabase.java
答案 0 :(得分:6)
SQLiteOpenHelper
将处理数据库版本控制,您只需要为其提供正确的数据库版本号和重写的回调。看看你的代码:
您的DB_VERSION
是1.在已发布版本之间更改数据库架构时,应增加此数字。版本号存储在数据库文件中,如果代码中提供的版本与文件中存储的版本不同,则会相应调用onUpgrade()
或onDowngrade()
。在您的情况下,由于数据库文件已存在,因此未调用onCreate()
,并且由于版本号匹配,因此未执行升级。
您的onUpgrade()
删除了该表,然后重新创建它。在某些情况下,这可能没问题,比如,它只是存储在别处的数据的缓存副本,但通常作为用户,我不希望应用程序升级来删除我的数据。实现onUpgrade()
,以便在保留数据的同时进行必要的模式修改。一些通用策略:
如果只是添加一些列ALTER TABLE
并添加一些合适的默认值。
如果模式更改更复杂,请将旧表重命名为临时名称,创建新表,然后从临时表中迁移数据。
在任何情况下,在onUpgrade()
之后,数据库模式应该具有相同的形状,如果调用onCreate()
来创建新数据库,但保留现有数据。