这可能已经有了答案,我已经检查但是我不确定该寻找什么“Android SQLite onUpgrade做的工作”?几个星期前我做了一些阅读,并解决了这个问题。
基本上我需要在数据库升级时做一些工作!震惊恐怖的权利(从他们的onUpgrade的问题数量来看,我远非孤独)但在我的情况下,这意味着产生各种活动,它可能是一个相当大的工作。
我已经了解到,尽管通常最好“熟悉”Android内容。
我不喜欢onUpgrade和onDowngrade 这些假设升级是具有逆的函数,并且工作具有低复杂性,因为不管数据库大小如何都不会花费太多时间。您没有机会向活动报告以表示它执行类似“Show the spinny loading thing”的操作,您是否仍然停留在GUI线程(主线程?)上。
我也认为这不是一个足够大的系统,特别是如果你使用数据库表作为结构类型的数组。如果要求,我会对此进行扩展。
SO: 我在哪里工作?关于onUpgrade,我正在努力解决的问题是什么?
我的解决方案: 我打算废弃onUpgrade和co,而不是在我的设置表中存储修订号(基本上是键值对),然后我将这个存储的数字与包含最新版本的常量进行比较,然后抛出,让活动捕获或检查看它是否准备就绪。
这意味着我可以升级我喜欢的方式,但这确实意味着我必须将SQLite包装在我自己的小层中,这不是一件坏事,我已经把表包好了,我认为不应该交易直接使用游标,但这是另一回事。
是否有我遗漏的东西,或者我应该自己升级。
我不问,因为这是一项艰巨的任务,因为你可以看到它不是,但为什么onUpgrade存在?我错过了什么吗?
感谢。
附录: 我试图在这里使用“完整的机器人”Correctly using onUpgrade (and content providers) to handle updates without blocking the main thread, are `Loader`s pointless?,但由于ContentProviders过度杀戮但这个问题的措辞很差,只是为了完全披露。
附录2
假设升级过程需要用户输入,并且升级处理程序将要启动活动,我无法从onUpgrade返回,直到数据库处于目标版本。我该怎么做呢?
答案 0 :(得分: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中保留结构更改,但在标准升级流程之外执行其他工作。
总会有一些问题需要更复杂的解决方案并导致你违背细节,但这是我尝试使用的标准方法。