0

这可能已经有了答案,我已经检查过了,但我不确定要寻找什么“Android SQLite onUpgrade 可以工作”?几周前我做了一些阅读,有点推迟了这个问题。

基本上我需要在数据库升级时做一些工作!震惊恐怖是对的(从其中包含 onUpgrade 的问题数量来看,我并不孤单)但就我而言,这意味着产生各种活动,这可能是一项相当大的工作。

我已经了解到,尽管通常最好“顺其自然”地使用 Android 的东西。

我不喜欢 onUpgrade 和 onDowngrade 这些假设升级是一个逆函数,而且工作复杂度低,无论数据库大小如何都不会花费太多时间。您没有机会向活动报告以指示它执行诸如“显示旋转加载的事情”之类的事情,您被困在 GUI 线程(主线程?)上。

我也不认为这是一个足够大的系统来提供帮助,特别是如果您将数据库表用作结构类型的数组。如果需要,我将对此进行扩展。

SO: 我在哪里工作?关于onUpgrade,我正在努力解决的问题是什么?

我的解决方案: 我打算废弃 onUpgrade 和 co,而是在我的设置表中存储一个修订号(基本上是键值对),然后我会将这个存储的数字与包含最新版本的常量进行比较,然后抛出,让活动捕获,或检查它是否已准备好。

这意味着我可以升级我喜欢的方式,但这确实意味着我必须将 SQLite 包装在我自己的小层中,这不是一件坏事,我已经包装了表,我认为不应该直接处理游标,但这是另一回事。

有什么我遗漏的东西,还是我应该自己升级。

我问不是因为这是一项艰巨的任务,因为您可以看到它不是,但是为什么 onUpgrade 存在?我错过了什么吗?

谢谢。

附录:我尝试在不阻塞主线程的情况下正确使用 onUpgrade(和内容提供程序)来“完整的 android”来处理更新,`Loader` 没有意义吗?在这里,但因为 ContentProviders 太过分了,但这个问题措辞不佳,只是为了充分披露。

附录 2

假设升级过程需要用户输入,并且升级处理程序想要启动一个活动,我无法从 onUpgrade 返回,直到数据库处于目标版本。我该怎么做呢?

4

1 回答 1

0

我在我的应用程序中使用 onUpgrade 并认为它运行良好。我确实非常注意确保我在 onUpgrade 中实现的更改非常简单,例如创建表或更改表。我会将数据库的所有结构更改保留在 onUpgrade 中,并通过不同的方法处理更改数据。这将您的 SQL 的稳定性与用户想要显示的内容分开,您可能希望用户随时更改该数据。

对我来说一个简单的 onUpgrade 可能如下所示:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 3) {
        createTranslationTable(db);
    }
    if (oldVersion < 4) {
        createStreamingColumns(db);
    }
}

如果用户旧版本的数据库是 2,那么数据库的两个更新都将运行。

听起来您在下载数据时需要的不仅仅是启动屏幕上的简单“升级,请稍候”,因此您只需将用户推到另一个活动以收集您所需的输入,然后启动升级。您仍然可以在 onUpgrade 中保留结构更改,但在标准升级流程之外进行其他工作。

总有一些问题需要更复杂的解决方案并导致您违背常规,但这是我尝试使用的标准方法。

于 2013-09-27T18:42:06.647 回答