Не удалось обновить таблицу sqlite_sequence с помощью RoomDatabase.query - PullRequest
0 голосов
/ 01 декабря 2018

Мы пытаемся обновить sqlite_sequence следующим кодом.

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

Однако это никак не влияет.Я проверяю содержимое таблицы sqlite_sequence с помощью браузера SQLite.Счетчик не сбрасывается до 0.

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

Наша база данных Room довольно проста.

@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

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

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

Попробуйте:

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

weNoteRoomDatabase().getOpenHelper().getWritableDatabase().query(sqlQuery);
0 голосов
/ 13 декабря 2018

Room не использует SQLiteDatabase - но использует SupportSQLiteDatabase , в то время как исходный код заявляет, что он delegates all calls to an implementation of {@link SQLiteDatabase} ... Iмог бы даже копать дальше - но я убежден, что это функция согласованности, а не ошибка.

SQLiteDatabase.execSQL() все еще отлично работает, но с SupportSQLiteDatabase.execSQL() те же самые запросы UPDATE или DELETEна внутренние таблицы не влияют и не выдают ошибок.

my MaintenanceHelper доступен на GitHub .важно, чтобы изначально Room позволяло создать базу данных, а затем можно управлять внутренними таблицами с помощью SQLiteDatabase.execSQL().во время исследования я наткнулся на аннотацию @ SkipQueryVerification , которая может возможно разрешить UPDATE или DELETE на столе sqlite_sequence;Мне удалось только выполнить SELECT с Dao ..., что в общем случае все подсказки для внутренних таблиц обрабатываются как read-only, с точки зрения общедоступного API;все попытки манипуляции молча игнорируются.

0 голосов
/ 07 декабря 2018

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

weNoteRoomDatabase.query(new SimpleSQLiteQuery("UPDATE sqlite_sequence SET seq = 0 WHERE name = attachment"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...