从以前的Android应用程序版本向SQLite添加其他列

时间:2014-01-04 19:50:49

标签: android sqlite crash updates

在我的Android应用程序中,我使用的是一个标准的SQLite数据库,其中一个帮助类有一个包含3列的表。在最近的更新中,我不得不在表中添加另一列,但是有些用户报告了崩溃,其中(根据堆栈跟踪判断)我认为来自新版本试图从不存在的列读取因为数据来自旧版本。除了手动备份和还原之外,如何在更新之间保护用户数据?

以下是完整更新的数据库类的链接: https://github.com/cjbrooks12/scripturememory/blob/working/src/com/caseybrooks/scripturememory/databases/VersesDatabase.java

1 个答案:

答案 0 :(得分:6)

SQLiteOpenHelper将处理数据库版本控制,您只需要为其提供正确的数据库版本号和重写的回调。看看你的代码:

  1. 您的DB_VERSION是1.在已发布版本之间更改数据库架构时,应增加此数字。版本号存储在数据库文件中,如果代码中提供的版本与文件中存储的版本不同,则会相应调用onUpgrade()onDowngrade()。在您的情况下,由于数据库文件已存在,因此未调用onCreate(),并且由于版本号匹配,因此未执行升级。

  2. 您的onUpgrade()删除了该表,然后重新创建它。在某些情况下,这可能没问题,比如,它只是存储在别处的数据的缓存副本,但通常作为用户,我不希望应用程序升级来删除我的数据。实现onUpgrade(),以便在保留数据的同时进行必要的模式修改。一些通用策略:

    • 如果只是添加一些列ALTER TABLE并添加一些合适的默认值。

    • 如果模式更改更复杂,请将旧表重命名为临时名称,创建新表,然后从临时表中迁移数据。

    在任何情况下,在onUpgrade()之后,数据库模式应该具有相同的形状,如果调用onCreate()来创建新数据库,但保留现有数据。

    < / LI>