Как удалить колонку в следующей версии комнаты базы данных Android? - PullRequest
0 голосов
/ 08 сентября 2018

Как удалить столбец в следующей версии комнаты базы андроид. Удалять или удалять не работает .?

@Database(entities = {User.class, AdTime.class}, version = 1, exportSchema = false)
  public abstract class AppDataBase extends RoomDatabase {

  private static AppDataBase INSTANCE;

  public abstract UserDao userModel();

  public abstract AdDao adModel();

  public static AppDataBase getInMemoryDatabase(Context context) {

    if (INSTANCE == null) {
        INSTANCE = Room.databaseBuilder(context, AppDataBase.class, "adrider")
                // To simplify the codelab, allow queries on the main thread.
                // Don't do this on a real app! See PersistenceBasicSample for an example.
                .allowMainThreadQueries()
              //  .addMigrations(MIGRATION_1_2)
                //  .fallbackToDestructiveMigration()
                .build();
      }
      return INSTANCE;
    }

  static final Migration MIGRATION_1_2=new Migration(1,2) {
      @Override
      public void migrate(@NonNull SupportSQLiteDatabase database) {
          database.execSQL("ALTER TABLE User "
                + "DROP Download");
      }
  };

}

Ответы [ 4 ]

0 голосов
/ 06 апреля 2019

Мой ответ очень похож на то, что дал @Pedro Romao, за исключением того, что я удалил лишнее ненужное «NOT NULL», включенное в операторы sql. Его следует добавлять только в случае необходимости, поскольку это может даже привести к ошибке, когда столбцу разрешено принимать значение Null.

    // Create a table that would be your new table. Specify the type of each field and include NON NULL when field can't be null for example in the case of a primary key
    database.execSQL("CREATE TABLE Users_backup (id INTEGER NOT NULL, name TEXT, PRIMARY KEY(id))"); 
    // Copy the desired columns from the old table into this new table
    database.execSQL("INSERT INTO Users_backup (id, name) SELECT id, name FROM Users");
    // Delete the old table
    database.execSQL("DROP TABLE Users");
    // Rename the new table to the old table's name so that the rest of your code can recognize this table as the former one.
    database.execSQL("ALTER TABLE Users_backup RENAME TO Users");
0 голосов
/ 08 сентября 2018

Вы должны сделать 4 шага: 1. Создайте новую таблицу 2. Скопируйте данные 3. Удалить старый стол 4. Измените имя таблицы на правильное

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
    // Create the new table
    database.execSQL(
            "CREATE TABLE users_new (userid TEXT, username TEXT, last_update INTEGER, 
    PRIMARY KEY(userid))");
    // Copy the data
    database.execSQL(
            "INSERT INTO users_new (userid, username, last_update) SELECT userid, 
    username, last_update FROM users");
    // Remove the old table
    database.execSQL("DROP TABLE users");
    // Change the table name to the correct one
    database.execSQL("ALTER TABLE users_new RENAME TO users");
    }
};
0 голосов
/ 27 февраля 2019

Спасибо @MrVasilev и @nobody special. В моем случае я получил ошибку во время миграции.

Мне пришлось создать таблицу с точно оригинальной структурой, задав типы столбцов, принудительно установив NOT NULL и установив ПЕРВИЧНЫЙ КЛЮЧ.

database.execSQL("CREATE TABLE backup_table (id INTEGER PRIMARY KEY NOT NULL, title TEXT NOT NULL, account TEXT NOT NULL, hash TEXT NOT NULL, sequence INTEGER NOT NULL)")
database.execSQL("INSERT INTO table_backup(id, title, account, hash, sequence) SELECT id, title, account, hash, sequence FROM original_table")
database.execSQL("DROP TABLE original_table")
database.execSQL("ALTER TABLE backup_table RENAME TO original_table")

Прочитайте журналы, чтобы понять, что не так во время миграции:

Migration didn't properly handle 

Expected: TableInfo{name='my_table', columns={sequence=Column{name='sequence', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}, title=Column{name='title', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0}, account=Column{name='account', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0}, hash=Column{name='hash', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[]} 

Found: TableInfo{name='my_table', columns={sequence=Column{name='sequence', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1}, title=Column{name='title', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0}, account=Column{name='account', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0}, hash=Column{name='hash', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
0 голосов
/ 08 сентября 2018

Принцип должен быть таким же, как вы используете SQLite под комнатой. Таким образом, вы должны иметь возможность выдавать те же операторы SQL, которые описаны в этой ссылке. Вы пробовали?

database.execSQL("CREATE TABLE t1_backup AS SELECT a, b FROM t1");
database.execSQL("DROP TABLE t1");
database.execSQL("ALTER TABLE t1_backup RENAME TO t1");

Очевидно, измените имена таблиц и столбцов в соответствии с вашим сценарием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...