Комната Android - очистка sqlite_sequence не работает

Следующий код не сбрасывает / не очищает идентификатор автоматического увеличения до 0

database = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, DatabaseMeta.DB_NAME)
            .build();
database.query("DELETE FROM sqlite_sequence WHERE name = ?", new Object[]{"tableName"});

или же

database.query("REPLACE INTO sqlite_sequence (name, seq) VALUES ('mission', -1)", null);

Есть ли способ очистить sqlite_sequence в комнате Android?

В комнате Android не используется sqlite_sequence для логики автоматического увеличения, я думаю, не уверен. Пытался распечатать записи sqlite_sequence, не могу найти имя таблицы, которое я использовал (с первичным ключом автоинкремента).

Вы получили ответ?

byteC0de 09.02.2019 09:37
4
1
752
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Алгоритм определения рядовой, когда используется AUTOINCREMENT, и, таким образом, когда sqlite_sequence создается / используется, использует большее из наивысших существующих рядовой или значение (столбец seq) в таблице sqlite_sequence.

Таким образом, если в связанной таблице существуют какие-либо строки, то установка столбца seq не будет иметь никакого эффекта, если его значение не превышает максимальное значение рядовой в связанной таблице.

Если в таблице нет строк, я считаю, что удаление таблицы приведет к автоматическому удалению соответствующей строки в таблице sqlite_sequence.

Ответ принят как подходящий

Попробуйте, этот код работает для меня

class FeedReaderDbHelper extends SQLiteOpenHelper {
    static final int DATABASE_VERSION = 1;
    static final String DATABASE_NAME = DBConfig.DATABASE_NAME;

    FeedReaderDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public void onCreate(SQLiteDatabase db) {
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onCreate(db);
    }

    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }
}

FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(mainContext.getApplicationContext());
mDbHelper.getWritableDatabase().execSQL("DELETE FROM sqlite_sequence WHERE name='table_name';");

Кажется, что комната Android не поддерживает очистку sqlite_sequence, что объясняется в stackoverflow.com/a/53764393/3442067. Придется создать собственный SQLiteOpenHelper для очистки или изменения таблицы sqlite_sequence.

uday 20.01.2020 11:30

Я поместил эту функцию в свой класс RoomDatabase:

        companion object {

    fun resetPointer(nonRoomDb: MyRoomDatabase){

      nonRoomDb.openHelper.writableDatabase.execSQL("DELETE FROM sqlite_sequence")

}       
}

Таким образом, вы можете вызывать это везде в коде:

    val database = MyRoomDatabase.getInstance(application)

    MyRoomDatabase.resetPointer(database)

Другие вопросы по теме