SQLiteException при первом вызове базы данных после обновления - PullRequest
0 голосов
/ 01 февраля 2019

Справочная информация: По сути, мы ежемесячно выпускаем новую версию нашего приложения с обновленной базой данных (которая предварительно заполнена).Чтобы убедиться, что у пользователя самые последние данные, мы используем '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
}
}
...