android - 从以前的 Android 应用程序版本向 SQLite 添加额外的列

标签 android sqlite crash updates

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

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

最佳答案

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

  1. 您的 DB_VERSION 是 1。当您在发布的版本之间更改数据库模式时,您应该增加这个数字。版本号存储在数据库文件中,如果代码中提供的版本与文件中存储的版本不同,将调用onUpgrade()onDowngrade()因此。在您的情况下,由于数据库文件已经存在,因此没有调用 onCreate() 并且由于版本号匹配,因此没有执行升级。

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

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

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

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

关于android - 从以前的 Android 应用程序版本向 SQLite 添加额外的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20925945/

相关文章:

Android 蓝牙套接字未创建

java - 如何在 Android 中渲染 PDF

c# - iOS 版 SQLite - RANDOM() 不够好

qt - Qt QCoreApplication::exec()在Ubuntu 12.04上崩溃

使用 iOS 11 的 iPhone 使用相机并锁定屏幕后 iOS 应用程序崩溃

java - 音频管理器分割为比 Android 提供的更多级别

android - 解析 XML 时出错 : unbound prefix on custom LinearLayout

具有首选语言的 SQLite FTS4

android - 在android中找不到列item_name

Python崩溃没有错误