在我的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()创建新数据库相同的形状,但保留现有数据。

    10-07 19:20
    查看更多