Android SQLite – изменение journal_mode

Я пытаюсь изменить journal_mode для своей базы данных с помощью кода. Я попробовал SQLiteDatabase.execSQL("PRAGMA journal_mode=OFF"), но это не удается, потому что выражение "PRAGMA journal_mode=OFF" возвращает результат (я проверил это с терминала), и поэтому Android думает, что это запрос, и жалуется, что я вместо этого следует использовать execQuery. Но то, что я пытаюсь выполнить, не является запросом.

Я также попытался скомпилировать выражение прагмы в SQLiteStatement и вызвал метод выполнения, но тот же результат.

Может ли кто-нибудь предложить какие-либо альтернативы, чтобы заставить эту работу работать через код?

Спасибо, Ранджит


person Ranjit    schedule 02.03.2011    source источник


Ответы (2)


Возможно, вы страдаете от этой проблемы, связанной с тем, что документы execSQL говорят о:

При использовании enableWriteAheadLogging(), journal_mode автоматически управляется этим классом. Поэтому не устанавливайте journal_mode с помощью инструкции «PRAGMA journal_mode», если ваше приложение использует enableWriteAheadLogging().

Убедитесь, что вы не используете ведение журнала с опережающей записью, и тогда это может сработать.

Обновление: как сказал Ранджит в комментариях, это должно работать:

Cursor c1 = db.rawQuery("PRAGMA journal_mode=OFF", null); 
c1.close();
person Robert Massaioli    schedule 02.03.2011
comment
Я нигде не устанавливаю этот параметр в своем коде. Согласно документации Android, enableWriteAheadLogging был представлен только на уровне API l1 или Android 3.0 (developer. android.com/guide/appendix/api-levels.html), и я все еще компилирую для Android 2.1, уровень API 7 - person Ranjit; 02.03.2011
comment
Это работает. Курсор c1 = db.rawQuery (PRAGMA journal_mode = OFF, null); c1.закрыть(); - person Ranjit; 02.03.2011
comment
На всякий случай, если это кому-то полезно (Ранджит, похоже, не очень часто использует SO)... В моем коде я пытался сделать db.rawQuery("PRAGMA journal_mode=OFF", null); c1.close();, и после этого, если я запросил прагму (опустив =MODE), она вернулась, чтобы сохраниться . Но если я сделаю c1.moveToNext(); c1.getString(0);, это сработает :) - person helios; 31.01.2013

Это можно сделать с помощью следующей команды:

db.execSQL("PRAGMA journal_mode=OFF;");

(Не нужно создавать Cursor, как это предлагается в одном из комментариев к ответу Роберта)

person Oleksandr    schedule 14.07.2017
comment
Согласно developer.android.com/reference/android/database/ sqlite/ нет метода rawExecSql(). - person user149408; 05.07.2020
comment
@ user149408, вы правы. Изменено на execSQL -› developer.android.com/reference/android/database/sqlite/ - person Oleksandr; 14.07.2020