SQLite не вставляет запись мгновенно - PullRequest
0 голосов
/ 18 июня 2020

Я работаю над приложением, которое сохраняет транзакции в базе данных SQLite после получения оплаты. Как только транзакция подтверждена, она добавляется в базу данных, и после этого пользователю отображается подтверждение. Я показываю одобрение, когда получаю результат от метода sqlitedatabase.insert (), и проверяю, что он возвращает номер строки.

public static boolean insert(String tableName, SQLiteDatabase sqLiteDatabase, ContentValues contentValues){
        long rowId = sqLiteDatabase.insert(tableName, null, contentValues);
        return rowId != -1;
    }

Проблема в том, что когда одобрение показывается пользователю, я выключаю устройство при извлечении батареи (я тестирую аккумулятор без батареи), и когда я перезагружаю устройство, я вижу, что в базе данных не вставляется запись . Это заставляет меня думать, что SQLite вставляет записи асинхронно после возврата идентификатора строки.

Я использую AsyncTask и делаю вставку в doInBackground, и я показываю одобрение пользователя в onPostExecute () AsyncTask.

Мой вопрос: есть ли способ убедиться, что запись вставляется в тот момент, когда я вызываю метод вставки, или я здесь что-то делаю не так?

1 Ответ

1 голос
/ 19 июня 2020

После некоторых исследований я понял, в чем проблема. Это была настройка конфигурации SQLite по умолчанию, а синхронная настройка НЕ ​​была ПОЛНОЙ. Согласно документации :

FULL (2) Когда синхронный - FULL (2), механизм базы данных SQLite будет использовать метод xSyn c VFS, чтобы гарантировать, что все содержимое безопасно записывается на поверхность диска перед продолжением. Это гарантирует, что ошибка sh операционной системы или сбой питания не приведут к повреждению базы данных . ПОЛНЫЙ синхронный режим очень безопасен, но он также медленнее. FULL является наиболее часто используемой синхронной настройкой, когда не в режиме WAL.

Конфигурация по умолчанию не была FULL, и я изменил ее в своем классе SQLiteOpenHelper 'onConfigure callback. И это решило проблему.

@Override
public void onConfigure(SQLiteDatabase db) {
    db.execSQL("PRAGMA synchronous = 2");
}

Хотя в документе указано, что «ПОЛНЫЙ синхронный режим очень безопасен, но он также медленнее», я не заметил значительной разницы в производительности, несмотря на то, что в некоторых случаях выполняется пакетная вставка .

...