【问题标题】:Android - new column in database and restore DB from backupAndroid - 数据库中的新列并从备份中恢复数据库
【发布时间】:2021-12-19 20:20:57
【问题描述】:

在 Android 中,我使用的是 SQLite 数据库,并且有一个包含 ID、名称、年龄的结构。

用户可以将数据库备份到 Google Drive。到目前为止一切正常。

问题是,我正在开发我的应用程序的新版本,并且我正在向数据库中添加另一列。所以它看起来像 ID、姓名、年龄、性别。

我用onUpgrade(SQLiteDatabase db, int i, int i1) 解决了这个问题,所以如果数据库的版本比当前版本旧,它将在我通过 ALTER 表添加新列时运行 onUpgrade。

到目前为止一切顺利。但是,如果用户已经有了这个新数据库,但在 Google 驱动器上有旧数据库,并且他从云中恢复了那个旧数据库,该怎么办?

当 db 文件被替换为旧版本时,onUpgrade 会立即运行,还是每次从云端恢复后我都需要强制运行 onUpgrade?​​p>

不确定何时执行 onUpgrade - 仅在应用启动时,或任何时候调用任何数据库操作并看到版本差异?

【问题讨论】:

  • 版本是从数据库中读取的。所以这应该没问题...您需要做的就是使用帮助程序类的新实例(因为当没有打开的连接时调用 AFAIK onUpgrade db 并且您正在尝试获取一个)

标签: java android sqlite android-sqlite


【解决方案1】:

当 db 文件被替换为时,onUpgrade 是否会立即运行 旧版本...

不,替换数据库后不会调用onUpgrade()

每次从云端还原后,我是否需要强制运行 onUpgrade?​​p>

你不应该打电话给onUpgrade()

还原过程完成后,您可以调用getWritableDatabase()getReadableDatabase()打开数据库。
此时现有数据库的版本与您在SQLiteOpenHelper 类中的代码的差异将调用onUpgrade()

【讨论】:

  • 谢谢,我认为这就足够了,如果用户执行了一些将打开并使用 DB 的操作,将调用 onUpgrade,因此将调用 onUpgrade,所以我不需要在数据库恢复后调用 getWritableDatabase()。
  • @Darksymphony 使用 getWritableDatabase() 或 getReadableDatabase() 打开数据库:developer.android.com/reference/android/database/sqlite/…
  • 是的,但是我在DatabaseHelper类中有getWritableDatabase(),它在我从DB中检索数据时执行,我想说,我不需要在恢复数据后直接调用getWritableDatabase()来自云端,因为它是在用户执行某些操作时调用的,即连接到数据库,所以 onUpgrade 将在那个时候调用,而不是在恢复后立即调用,我认为没关系
  • @Darksymphony 如果这就是你的意思,那么是的。但有时升级操作可能需要一段时间,所以如果你让它在用户决定访问数据库时执行,他们可能会遇到一些延迟。另一方面,如果您在还原操作之后执行此操作,则它只是整个过程的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
相关资源
最近更新 更多