10

我有一个依赖于 SQLite 的应用程序来获取数据,这些数据由资产文件夹中的应用程序附带的 xmls 填充。

  1. 当您第一次运行应用程序时,它会设置一个共享首选项 config_run = false。
  2. 然后我检查 config_run = false 然后解析 xml 并将数据转储到 db
  3. 设置 config_run = true

现在我意识到当我必须在 Google Play 上推送更新并将更多内容添加到 XML 中时。即使我将数据库版本从 1 更改为 2。导入脚本不会运行,因为共享首选项 config_run 值将设置为 true。

关于如何处理这种情况的任何指示?

场景

  1. 首次安装 - Ver = 1,DB V = 1(数据被解析并转储到数据库中)
  2. 错误修复并推送和更新,但没有数据更改 - ver = 1.1,DB V = 1(它应该只是替换代码而不是升级或重新创建数据库)
  3. 升级了 DATA 并推送了新的更新 - 1.2 版,DB = 2(没有新代码,但必须重新创建数据)

我的应用程序的流程

  1. 应用程序启动 Splash Activity。如果 Shared Pref - config_run 等于 false,那么它会启动一个进度对话框并解析数据并将其转储到数据库中。
  2. 在解析和创建数据库并转储数据后,它会转到 MainActivity。

第二种情况

  1. SplashActivity 运行和 config_run = true 所以直接进入 MAin Activity。

正如下面少数人所建议的那样,如果我尝试在 SQLiteHelper 的 onUpgrade 中将数据哑化到数据库中,它只会发生在 MAinActivity 中,因为我没有在 SplashActivity 中打开 Db 连接,并且对话进度也不会显示。

4

5 回答 5

8

添加您上次运行脚本的版本号的共享首选项。在应用程序启动时,检查当前的 apk 版本,如果更新,再次运行脚本并更新首选项

于 2013-01-16T15:34:39.093 回答
7

你为什么不想使用内置的 sqlite 版本控制系统。数据库版本独立于应用程序版本。它完全符合您的要求。SQLiteOpenHelper?每次您更改数据库版本时,都会调用 onUpgrate 回调,您可以重新填充数据库。有很多例子。

于 2013-01-19T18:27:47.103 回答
4

让您的 xmlfiles 以更新日期结束,并将最后更新日期存储在 sharedpref 中。

在启动时,您可以检查更新搜索(以优化的方式),以及与您上次知道需要转储文件的时间相比,是否找到具有新日期的新文件。

总黑客工作:D

于 2013-01-20T09:12:48.967 回答
4

无需将共享首选项 (config_run) 设置为 false 并将其设置为 true,只需将数据库版本设置到其中即可。更新应用时,请检查共享首选项中的版本号是否相同。您可以如下所示执行此操作:

configRun = settings.getInt("database_version", 0);

if ((DBAdapter.DATABASE_VERSION) == configRun) 
{
//skip xml parsing
}
else
{
//first time configRun will be "0" and DBAdapter.DATABASE_VERSION will be 1
// so you need to parse your xml here and set configRun =1
//on update, change your DB version to 2. now again your configRun and DBAdapter.DATABASE_VERSION will mismatch and you can parse your xml.
}
于 2013-01-24T12:43:24.433 回答
3

你可以做两件事:

  1. 正确的方法:覆盖数据库提供者的 onUpdate() 来导入文件。(如上所述)

  2. 换行符:不是检查 key="config_run",而是检查并设置 key=("config_run"+DB_VERSION) 以查看是否需要导入,当然,如果密钥不存在,则应返回错误的。这样每次更新数据库编号时,导入作业都会再次运行。

这与您的应用程序版本无关。

于 2013-01-23T20:45:32.543 回答