我们在Android应用程序中成功使用ormlite;为了维护数据库版本,我们使用这样的方法: http://www.michenux.net/android-database-sqlite-creation-upgrade-245.html
最近,我们看到该领域的“超自然活动”,应用程序处于数据库状态,他们无法“理智地”,并试图找到解释。
可能的情况是,当Google Play自动升级运行应用程序时,会执行onUpgrade(),更改表格和数据,同时使用旧的(或新的?)应用程序,或者也许他们的IntentServices会同时访问数据库,并得到奇怪的结果。
(可悲的是,没有简单的方法可以说“在升级之前完全停止我的应用程序,进行升级,然后完全重启”。有MY_PACKAGE_REPLACED意图,但有关如何使用它的意见大不相同......)
所以我的问题是,是否有任何保护使onUpgrade()独占运行,即阻止或锁定或同步任何东西,以确保另一个线程不会访问我的表,例如我删除列(即重命名,重新创建,复制旧选项卡中的数据)。
如果不是,我怎么能以最安全的方式做到这一点?
谢谢&亲切的问候。
答案 0 :(得分:0)
好的,所以 -
彻底的分析揭示了导致所有这些问题的另一个(手工制作)问题。
所以,不要传播任何谣言:onUpgrade()似乎没有竞争条件!
如果知道为onUpgrade()创建一个(独占的?)事务块是不错的做法,那会很高兴,不过...... 我确实有一个使用begin transaction的迁移,而sqlite在嵌套事务时抛出错误,所以我很确定onUpgrade()周围没有。
澄清其他问题 是的,应用程序在升级之前已终止。 只有服务可能需要重新读取配置,并且警报(计时器)可能需要重新启动。