安卓应用在Play Store上推送更新

10

我有一个应用程序,依赖于SQLite进行数据存储,该数据由内置在资产文件夹中的XML文件填充。

  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. 升级了数据并推送了新更新- ver 1.2,DB = 2(没有新代码,但必须重新创建数据)

我的应用程序流程

  1. 应用程序启动闪屏活动。如果共享首选项-config_run等于false,则启动进度对话框并解析并将数据转储到数据库中。
  2. 在解析和创建数据库并转储数据后,转到MainActivity。

第二种情况

  1. SplashActivity运行,config_run = true,因此直接进入MAin Activity。

正如下面的一些人建议的那样,如果我尝试在SQLiteHelper的onUpgrade中将数据转储到数据库中,它只会在MAinActivity中发生,因为我没有在SplashActivity中打开Db连接,并且Dialog Progress也不会显示。


你是在SQLiteOpenHelperonCreate方法中解析那些资产XML文件,还是手动解析呢? - user
@Luksprog 我现在正在我的“启动画面活动”中做它们。 - Harsha M V
5个回答

8

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


你的意思是根据应用程序的版本号进行操作,而不是针对config_run吗? - Harsha M V
是的。使用清单文件中的android:versionCode="123"。 要从代码中获取它,请参见http://stackoverflow.com/questions/6593592/get-application-version-programatically-in-android。 - yoah
在第一次运行时,我设置了版本。然后转储数据。下次如果版本相同,则跳过。当应用程序升级时,它将重新运行脚本。 - Harsha M V
当我仅基于版本进行操作时,会出现重复数据。 - Harsha M V

7

为什么您不想使用内置的SQLite版本控制系统呢?DB版本独立于应用程序版本。它完全可以满足您的需求。 SQLiteOpenHelper?每次更改数据库版本时,都会调用onUpgrate回调函数,您可以重新填充数据库。有很多示例。


你是说我应该在SqliteHelper内部解析XML吗?你能请指出任何示例吗? - Harsha M V
是的,我正在使用那个。但是与共享首选项一起使用会变得有点复杂。我需要找出一种方法,只在我更改XML内容时转储数据并重新创建数据。 - Harsha M V
所以将您的解析移动到onUpgrade方法中,并在启动屏幕活动中创建SQLiteHelper以在启动屏幕可见时更新数据库。如果您仍然想使用首选项,@yoah已经给出了正确的答案。删除旧数据并加载新数据。 - Leonidos
当在启动画面且正在进行升级时,我想显示一个进度条,以便用户知道正在发生什么。这就是我将其移动到onUpgrade时所关心的问题。 - Harsha M V
2
是的,如果你打开db(getWritableDatabase会被某种方式调用),onUpgrade方法将被调用。如何实现数据库升级取决于你,但我更喜欢内置解决方案。SQLiteHelper就有一个。 - Leonidos
显示剩余4条评论

4

请将您的xml文件以更新日期结尾,并将上次更新日期存储在sharedpref中。

在启动时,您可以优化地搜索更新,并且如果与上次不同的新文件具有更新日期,则需要删除该文件。

总体来说这是一个比较粗糙的做法:D


谢谢你的解决方案 :D 我会保持问题开放,以吸引其他人提供任何其他的解决方案 :D 我觉得这将是一个很好的技巧。 - Harsha M V

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.
}

3

你可以做两件事:

  1. 正确的方法:重写数据库提供者的onUpdate()方法来导入文件。(如上所建议)

  2. 一行代码的修改:不是检查key="config_run",而是检查并设置key=("config_run"+DB_VERSION)来查看是否需要导入,并且如果key不存在,应该返回false。这样每次更新数据库版本号时,导入任务都会重新运行。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接