如何在Android会议室数据库的下一版本中删除列?

Ava*_*rya 4 android android-room

如何删除房间数据库android.DROp的下一版本中的列或删除不起作用?

@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");
      }
  };

}
Run Code Online (Sandbox Code Playgroud)

nob*_*ial 6

原理应该还是一样的,因为你在 Room 下使用 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");
Run Code Online (Sandbox Code Playgroud)

显然更改表名和列名以适合您的方案。


MrV*_*lev 5

您必须执行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");
    }
};
Run Code Online (Sandbox Code Playgroud)