3

所以我想知道使用http://www.mapdb.org作为我的应用程序的存储机制(因为我相信它代表了 java 数据层的未来,但我离题了)。

但是它还不支持模式演化。因此,在此期间,更改持久类的字段会导致它崩溃。升级后的应用程序无法更新数据,因为它已经随新版本的类一起提供。

我需要的是一个钩子,当更新发生时触发,旧版本可以以临时格式(xstream xml)输出数据,以便新版本可以愉快地继续。游戏商店是否支持这样的东西?

像这样 的SQLite onUpgrade()问题 似乎表明存在 onUpgrade,但是因为那时类的模式已经破坏,所以我认为为时已晚。如果我提供自己的应用内准备,则无法保证它会在 Playstore 升级机制运行之前运行。

更新:我意识到 onUpgrade 是一个 sqlite 的东西,而不是引用问题中的一个 android 的东西。我的错

还要强调一下,这个问题是指一个对象数据库,其中类的序列化版本很重要,它还不支持模式演变。

4

2 回答 2

1

我建议使用SharedPreferences在上次启动时存储应用程序的版本,并将其与当前应用程序版本进行比较。如果存储在 SharedPreferences 中的最后一个版本比当前版本旧,您可以执行升级任务。

您可以检查您的应用程序版本

PackageInfo packageInfo = activity.getPackageManager()
    .getPackageInfo(activity.getPackageName(), 0);
int versionCode = packageInfo.versionCode;

您的代码最终可能看起来像这样:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
int lastVersion = prefs.getInt("lastVersion", -1);
if (lastVersion != -1 && lastVersion  < versionCode) {
    // Perform update logic
    prefs.edit().putInt("lastVersion", versionCode).commit();
}

当然,您也可以检查旧版本的特定编号,因此如果从应用程序的版本 15 升级到版本 18 需要一组特定的任务,您可以执行这些任务。

于 2013-10-02T14:15:34.257 回答
0

此答案中概述的 SQLite onUpgrade 操作和步骤有哪些不清楚的地方?

架构更改了,您知道更改是什么,因此您根据需要编写 SQL(可能是原始 SQL)来修改表(添加/删除列,并填写新列)等。

除非您指的是从数据库中反序列化事物,否则不确定您所说的“类已更改”是什么意思,在这种情况下:a)您仍然可以访问旧类,b)您知道新类的样子,所以如上所述,您编写代码以将数据从旧数据移动到新数据。

我遇到的唯一问题是尝试添加具有“非空”约束的列,因为 sqlite 不允许您这样做(即,您会通过更改表来创建具有空值的列,因此违反了约束)。(我删除了约束,但也许更复杂的更新表语句也可以工作)

于 2013-10-02T14:15:04.567 回答