【问题标题】:Android Pushing Updates on Play StoreAndroid 在 Play 商店上推送更新
【发布时间】:2012-12-30 23:01:36
【问题描述】:

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

  1. 当您第一次运行应用程序时,它会设置共享首选项 config_run = false。
  2. 然后我检查 config_run = false 然后解析 xml 并将数据转储到数据库中
  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 活动。如果 Shared Pref - config_run 等于 false,那么它会启动一个进度对话框并解析数据并将其转储到数据库中。
  2. 在解析和创建数据库并将数据转储到 MainActivity 时。

第二种情况

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

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

【问题讨论】:

  • 你在哪里解析这些资产 xml 文件?在SQLiteOpenHelperonCreate 方法中还是手动?
  • @Luksprog 我现在正在我的 Splash Activity 中做这些事情。

标签: android sharedpreferences android-sqlite sqliteopenhelper


【解决方案1】:

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

【讨论】:

  • 你的意思是根据应用程序的版本号而不是 config_run 对吗?
  • 是的。使用清单中的 android:versionCode="123" 。要从代码中获取它,请参阅stackoverflow.com/questions/6593592/…
  • 第一次运行时我设置了版本。然后转储数据。下次如果版本相同则跳过。当应用程序升级时,它会重新运行脚本。
  • 当我仅根据版本进行操作时。我收到重复的数据
【解决方案2】:

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

【讨论】:

  • 你的意思是我应该从 sqlitehelper 中解析 xml 吗?你能举个例子吗?
  • 我的意思是,如果您在项目中附带一个数据库,那么有一个内置的 mechanizm 可以进行数据库更新。 db 版本更改时调用 onUpgrade 方法,您应该做一些事情来升级它。为什么要将xml添加到资产?为什么你不想用应用程序预装数据库?
  • 是的,我正在使用它。但是将它与共享首选项一起使用变得有点复杂。当我更改 xml 中的内容时,我需要找出一种方法来使数据变哑并重新创建数据
  • 所以当你改变 xml 时,在你的 sqlhelper 中改变 db 版本。公共 MySQLiteHelper(上下文上下文){ 超级(上下文,DATABASE_NAME,null,DATABASE_VERSION); } onUpgrade 方法将被调用,您可以删除旧数据并加载新数据。
  • 是的,如果你打开 db(getWritableDatabase 会以某种方式调用),就会调用 onUpgrade 方法。如何实施数据库升级取决于您,但我更喜欢内置解决方案。 SQLiteHelper 也有一个。
【解决方案3】:

不要将您的共享首选项 (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.
}

【讨论】:

    【解决方案4】:

    让您的 xml 文件以更新日期结尾,并将最后更新日期存储在 sharedpref 中。

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

    全部黑客工作:D

    【讨论】:

    • 感谢您的解决方案 :D 我将保持问题开放以吸引其他人提供任何其他解决方案 :D 我认为这将是一个很好的 hack。
    【解决方案5】:

    你可以做两件事:

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

    2. 单行转换器:您无需检查 key="config_run",而是检查并设置 key=("config_run"+DB_VERSION) 以查看是否需要导入,当然,如果需要导入不存在,你应该返回false。 这样每次更新数据库编号时,导入作业都会再次运行。

    这与您的应用版本无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      相关资源
      最近更新 更多