Ответ 1
Я думаю, что запрос неправильный, вы должны попробовать ниже запроса
weNoteRoomDatabase.query(new SimpleSQLiteQuery("UPDATE sqlite_sequence SET seq = 0 WHERE name = attachment"));
Мы пытаемся обновить sqlite_sequence
с помощью следующего кода.
WeNoteRoomDatabase weNoteRoomDatabase = WeNoteRoomDatabase.instance();
weNoteRoomDatabase.query(new SimpleSQLiteQuery("UPDATE sqlite_sequence SET seq = 0 WHERE name = 'attachment'"));
Однако это никак не влияет. Я sqlite_sequence
содержимое таблицы sqlite_sequence
с помощью браузера SQLite. Счетчик не сбрасывается в 0.
Если мы попытаемся выполнить тот же запрос вручную с помощью браузера SQLite для того же файла SQLite, он будет работать просто отлично.
Наша база данных номеров довольно проста.
@Database(
entities = {Attachment.class},
version = 6
)
public abstract class WeNoteRoomDatabase extends RoomDatabase {
private volatile static WeNoteRoomDatabase INSTANCE;
private static final String NAME = "wenote";
public abstract AttachmentDao attachmentDao();
public static WeNoteRoomDatabase instance() {
if (INSTANCE == null) {
synchronized (WeNoteRoomDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(
WeNoteApplication.instance(),
WeNoteRoomDatabase.class,
NAME
)
.build();
}
}
}
return INSTANCE;
}
}
Есть идеи, что мы упустили?
Дополнительная информация: очистка sqlite_sequence не работает в комнате Android
Я думаю, что запрос неправильный, вы должны попробовать ниже запроса
weNoteRoomDatabase.query(new SimpleSQLiteQuery("UPDATE sqlite_sequence SET seq = 0 WHERE name = attachment"));
Таблица sql_sequence
не управляется Room, поэтому вам нужно отредактировать ее с помощью SupportSQLiteDatabase
.
Попробуй это:
String sqlQuery = "DELETE FROM sqlite_sequence WHERE name='attachment'";
weNoteRoomDatabase().getOpenHelper().getWritableDatabase().query(sqlQuery);
Room
не использует SQLiteDatabase - но она использует SupportSQLiteDatabase, в то время как в ее исходном коде говорится, что она delegates all calls to an implementation of {@link SQLiteDatabase}
... Я мог бы даже копать дальше - но я убежден, что это особенность согласованности, а не ошибка.
SQLiteDatabase.execSQL()
прежнему работает нормально, но с SupportSQLiteDatabase.execSQL()
те же самые запросы UPDATE
или DELETE
к внутренним таблицам не действуют и не выдают ошибок.
мой MaintenanceHelper
доступен на GitHub. важно, чтобы изначально Room
SQLiteDatabase.execSQL()
Room
создать базу данных, а затем можно управлять внутренними таблицами с помощью SQLiteDatabase.execSQL()
. во время исследования я натолкнулся на аннотацию @SkipQueryVerification, которая может разрешить UPDATE
или DELETE
для таблицы sqlite_sequence
; Мне удалось выполнить SELECT
с Dao
..., что в общем случае все подсказки для внутренних таблиц обрабатываются только для read-only
, с точки зрения общедоступного API; все попытки манипуляции молча игнорируются.