升级后第一次数据库调用时出现SQLiteException

时间:2019-02-01 07:48:46

标签: android android-sqlite

背景:基本上,我们每个月都会使用更新的数据库(已预先填充)对应用程序进行新发行。为了确保用户拥有最新数据,我们在构造函数中使用“ 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
}
}

0 个答案:

没有答案