背景:基本上,我们每个月都会使用更新的数据库(已预先填充)对应用程序进行新发行。为了确保用户拥有最新数据,我们在构造函数中使用“ setForcedUpgrade()”。
问题:最近(大多数情况下是Android 9版本,在8.1上也有几次发现),我们已经在Google Play控制台上收到崩溃报告:
java.lang.RuntimeException:
at android.os.AsyncTask$3.done (AsyncTask.java:366)
at java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:383)
at java.util.concurrent.FutureTask.setException (FutureTask.java:252)
at java.util.concurrent.FutureTask.run (FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run (AsyncTask.java:257)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
at java.lang.Thread.run (Thread.java:784)
Caused by: android.database.sqlite.SQLiteException:
at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase (SQLiteAssetHelper.java:266)
at ...
我去检查SQLiteAssetHelper.java:266并发现:
if (db.getVersion() != mNewVersion) {
throw new SQLiteException("Can't upgrade read-only database from version " +
db.getVersion() + " to " + mNewVersion + ": " + path);
}
因此,我怀疑在尝试再次访问数据库时,数据库升级尚未完成。但是,我不知道如何解决此问题。我的第一个想法是在让用户继续使用该应用程序之前先“监听”升级完成的时间,但是我真的找不到解决方法。
还请注意,该数据库已经在23版上,因此我们最近没有对其进行更改(错误是新的)。
任何建议将不胜感激。
辅助程序的简化版本:
public class MyDBHelper extends SQLiteAssetHelper {
/** The database version. */
private static final int DATABASE_VERSION = 24;
/** The name of the database. */
private static final String DATABASE_NAME = "myDB.db";
public MyDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
setForcedUpgrade();
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//Empty
}
}