Мне нужно знать, как «УДАЛИТЬ ИЗ таблицы» с помощью библиотеки сохранения комнаты.
Я уже знаю, что мы можем удалить все строки с помощью метода:
@Query("DELETE FROM table")
void deleteAll();
Однако мне нужно удалить всю таблицу. Это связано с тем, что мой primary_key является столбцом с автоинкрементом, поэтому, используя предыдущий код, он не отдыхает.
Я уже читал ответы на эту тему в следующих ссылках:
Однако я не могу поверить, что эта библиотека не предоставляет более простой способ сделать это, независимо от причины или использования.
Можем использовать миграции, предоставляемые Room, для обновления базы данных с помощью наших собственных запросов. Поскольку мы хотим внести изменения в базу данных, которые Room не может разрешить (пока) из кода. Мы можем удалить таблицу, воссоздать ее или обновить. В зависимости от того, что нужно.
Вариант 1. Миграция с сохранением других данных
version в аннотации @Database. static final Migration MIGRATION_1_2 = new Migration(1, 2) { // From version 1 to version 2
@Override
public void migrate(SupportSQLiteDatabase database) {
// Remove the table
database.execSQL("DROP TABLE my_table"); // Use the right table name
// OR: We could update it, by using an ALTER query
// OR: If needed, we can create the table again with the required settings
// database.execSQL("CREATE TABLE IF NOT EXISTS my_table (id INTEGER, PRIMARY KEY(id), ...)")
}
};
Room.databaseBuilder(context, MyDatabase.class, "mydatabase")
.addMigration(MIGRATION_1_2) // Add the migration
.build();
Вариант 2. Миграция с данными проигрыш
Есть и быстрый вариант, но все данные в базе будут очищены!
Это связано с тем, что база данных воссоздается при использовании метода, описанного ниже.
version базы данных..fallbackToDestructiveMigration() при создании базы данных, например: Room.databaseBuilder(context, MyDatabase.class, "mydatabase")
.fallbackToDestructiveMigration()
.build();
Если вы хотите сделать это с помощью автоматической миграции, вам необходимо использовать спец. в качестве значения autoMigrations для аннотации @Database. Выглядит как это
autoMigrations = {@AutoMigration(from = 1, to = 2, spec = AppDatabase.MyAutoMigration.class)}
Например, вы хотите удалить таблицу (YourTableName) из базы данных версии 1, а затем перейти на версию 2, тогда полный код выглядит следующим образом.
@Database(
version = 2,
entities = {Entity1.class, Entity2.class},
autoMigrations = {@AutoMigration(from = 1, to = 2, spec = AppDatabase.MyAutoMigration.class)},
exportSchema = true)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
@DeleteTable.Entries(value = @DeleteTable(tableName = "YourTableName"))
public static class MyAutoMigration implements AutoMigrationSpec {
}
// Your DAO 1
// Your DAO 2
}
Я попробовал второй вариант. Однако я добавил дополнительный столбец с именем ID, теперь мое приложение вылетает, говоря, что столбец «id» не существует. Не могли бы вы помочь мне решить эту проблему? Спасибо.