Библиотека сохраняемости Android Room. Удалить таблицу

Мне нужно знать, как «УДАЛИТЬ ИЗ таблицы» с помощью библиотеки сохранения комнаты.

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

@Query("DELETE FROM table")
void deleteAll();

Однако мне нужно удалить всю таблицу. Это связано с тем, что мой primary_key является столбцом с автоинкрементом, поэтому, используя предыдущий код, он не отдыхает.

Я уже читал ответы на эту тему в следующих ссылках:

Однако я не могу поверить, что эта библиотека не предоставляет более простой способ сделать это, независимо от причины или использования.

10
0
10 803
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Можем использовать миграции, предоставляемые Room, для обновления базы данных с помощью наших собственных запросов. Поскольку мы хотим внести изменения в базу данных, которые Room не может разрешить (пока) из кода. Мы можем удалить таблицу, воссоздать ее или обновить. В зависимости от того, что нужно.

Вариант 1. Миграция с сохранением других данных

  1. Сначала увеличьте версию базы данных: обновите параметр version в аннотации @Database.
  2. Создайте миграцию следующим образом:
    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), ...)")
        }
    };
  1. Добавьте миграцию при создании базы данных:
    Room.databaseBuilder(context, MyDatabase.class, "mydatabase")
        .addMigration(MIGRATION_1_2) // Add the migration
        .build();
  1. Запустите приложение еще раз. Если запросы были правильными, миграция выполнена

Вариант 2. Миграция с данными проигрыш

Есть и быстрый вариант, но все данные в базе будут очищены!

Это связано с тем, что база данных воссоздается при использовании метода, описанного ниже.

  1. Как и в первом варианте, увеличьте version базы данных.
  2. Используйте .fallbackToDestructiveMigration() при создании базы данных, например:
    Room.databaseBuilder(context, MyDatabase.class, "mydatabase")
        .fallbackToDestructiveMigration()
        .build();
  1. Запустите приложение. Он удалит старую базу данных и создаст ее заново. (Все предыдущие данные стираются)

Я попробовал второй вариант. Однако я добавил дополнительный столбец с именем ID, теперь мое приложение вылетает, говоря, что столбец «id» не существует. Не могли бы вы помочь мне решить эту проблему? Спасибо.

Junia Montana 18.03.2020 01:04

Если вы хотите сделать это с помощью автоматической миграции, вам необходимо использовать спец. в качестве значения 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
}

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