在我的Android应用程序中,我使用的是带有帮助程序类的标准SQLite数据库,该类具有1个表和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()
创建新数据库相同的形状,但保留现有数据。