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