Следующий код не сбрасывает / не очищает идентификатор автоматического увеличения до 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, не могу найти имя таблицы, которое я использовал (с первичным ключом автоинкремента).
Алгоритм определения рядовой, когда используется 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.
Я поместил эту функцию в свой класс RoomDatabase:
companion object {
fun resetPointer(nonRoomDb: MyRoomDatabase){
nonRoomDb.openHelper.writableDatabase.execSQL("DELETE FROM sqlite_sequence")
}
}
Таким образом, вы можете вызывать это везде в коде:
val database = MyRoomDatabase.getInstance(application)
MyRoomDatabase.resetPointer(database)
Вы получили ответ?