Не удалось обновить таблицу sqlite_sequence с помощью RoomDatabase.query

Мы пытаемся обновить 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

Ответы

Ответ 1

Я думаю, что запрос неправильный, вы должны попробовать ниже запроса

weNoteRoomDatabase.query(new SimpleSQLiteQuery("UPDATE sqlite_sequence SET seq = 0 WHERE name = attachment"));

Ответ 2

Таблица sql_sequence не управляется Room, поэтому вам нужно отредактировать ее с помощью SupportSQLiteDatabase.

Попробуй это:

String sqlQuery = "DELETE FROM sqlite_sequence WHERE name='attachment'";

weNoteRoomDatabase().getOpenHelper().getWritableDatabase().query(sqlQuery);

Ответ 3

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; все попытки манипуляции молча игнорируются.