Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 运行应用程序中的onUpgrade竞赛条件_Android_Ormlite - Fatal编程技术网

Android 运行应用程序中的onUpgrade竞赛条件

Android 运行应用程序中的onUpgrade竞赛条件,android,ormlite,Android,Ormlite,我们正在android应用程序中成功地使用ormlite;为了维护数据库版本,我们使用如下方法: 最近,我们在该领域看到了“超自然活动”,应用程序处于数据库状态,它们不可能“正常”,并试图找到解释 一种可能是,当运行中的应用程序由Google Play自动升级时,会执行onUpgrade(),更改表和数据,而旧的(或新的?)应用程序,或者可能是它们的IntentService同时访问数据库,并得到奇怪的结果 (遗憾的是,没有简单的方法可以说“在升级之前完全停止我的应用程序,进行升级,然后完全重

我们正在android应用程序中成功地使用ormlite;为了维护数据库版本,我们使用如下方法:

最近,我们在该领域看到了“超自然活动”,应用程序处于数据库状态,它们不可能“正常”,并试图找到解释

一种可能是,当运行中的应用程序由Google Play自动升级时,会执行onUpgrade(),更改表和数据,而旧的(或新的?)应用程序,或者可能是它们的IntentService同时访问数据库,并得到奇怪的结果

(遗憾的是,没有简单的方法可以说“在升级之前完全停止我的应用程序,进行升级,然后完全重新启动”。这是my_PACKAGE_替换的意图,但关于如何使用它的意见大相径庭……)

所以我的问题是,是否有任何保护措施可以使onUpgrade()以独占方式运行,即阻止、锁定或同步任何内容,以确保在删除列(即重命名、重新创建、复制旧选项卡中的数据)时,其他线程不会访问我的表

如果没有,我怎样才能以最安全的方式完成这样的事情

谢谢和亲切的问候。

好的,那么-

彻底的分析暴露了另一个(手工)问题(在我们的代码中),它导致了所有这些问题

所以,不要散布任何谣言:似乎在onUpgrade()中没有种族条件

如果知道为onUpgrade()提供一个(独占的?)事务块是否是一种好的做法,那就太好了,不过。。。 我确实使用begin transaction进行了一次迁移,并且sqlite在嵌套事务上抛出了一个错误,所以我非常确定onUpgrade()附近没有自动执行的迁移

请澄清其他问题 是,应用程序在升级之前会被终止。
只有服务可能需要重新读取配置,而警报(计时器)可能需要重新启动。

这里的弱破解只是为了看看它是否可以工作,但您可以尝试设置一个静态变量,在更新时将其设置为true,在更新完成时将其设置为false。您需要确保升级过程异步运行。然后,您可以在发出任何可能损坏的请求之前检查该标志。看起来不太理想,但可能?Google Play在尝试升级应用程序之前没有停止吗?相关问题:。不幸的是,没有答案-(您是否有多个
SQLiteOpenHelper
实现的实例?我们能够重现这个问题,而且它确实似乎是应用程序启动时的竞争条件,其中onUpgrade修改正在读取的表。我想知道onUpgrade是否不应该总是在BEGIN EXCLUSIVE事务块内执行……是吗你还记得导致所有这些问题的问题吗?我面临着非常相似的情况。