在我的 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()
以创建新数据库时的形状相同,但是保留现有数据。
关于android - 从以前的 Android 应用程序版本向 SQLite 添加额外的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20925945/