Vraag Zaaldatabase-migratie als alleen nieuwe tabel is toegevoegd


Laten we aannemen dat ik een eenvoudige Room-database heb:

@Database(entities = {User.class}, version = 1)
abstract class AppDatabase extends RoomDatabase {
    public abstract Dao getDao();
}

Nu voeg ik een nieuwe entiteit toe: Pet en stoten versie naar 2:

@Database(entities = {User.class, Pet.class}, version = 2)
abstract class AppDatabase extends RoomDatabase {
    public abstract Dao getDao();
}

Natuurlijk gooit ruimte een uitzondering: java.lang.IllegalStateException: A migration from 1 to 2 is necessary.

Ervan uitgaande, ik ben niet veranderd User klasse (dus alle gegevens zijn veilig), ik moet zorgen voor migratie die zojuist een nieuwe tabel maakt. Dus, ik ben op zoek naar klassen die zijn gegenereerd door Room, op zoek naar gegenereerde query's om mijn nieuwe tabel te maken, deze te kopiëren en in migratie te plakken:

final Migration MIGRATION_1_2 =
        new Migration(1, 2) {
            @Override
            public void migrate(@NonNull final SupportSQLiteDatabase database) {
                database.execSQL("CREATE TABLE IF NOT EXISTS `Pet` (`name` TEXT NOT NULL, PRIMARY KEY(`name`))");
            }
        };

Ik vind het echter onhandig om dit handmatig te doen. Is er een manier om Room te vertellen: Ik raak niets aan van de bestaande tabel, dus gegevens zijn veilig. Maak een migratie voor mij aan?


26
2018-01-23 10:50


oorsprong


antwoorden:


Misschien in dit geval (als u alleen een nieuwe tabel hebt gemaakt zonder de andere te wijzigen), kunt u dit doen en helemaal geen migraties maken?


0
2018-05-22 12:40



U kunt een nieuwe SQlite-tabel maken op basis van Migratie zonder oude tabellen te wijzigen. Het is belangrijk om PrimaryKey te annoteren door @NonNull in @Entity. Zonder annotatie maakt Room geen nieuwe tabel met primaire sleutel.

@Entity
public class Pet {

  @PrimaryKey
  @android.support.annotation.NonNull
  @ColumnInfo(name = "name")
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

}

0
2018-06-25 18:07



Je kunt deze manier doen-

@Database(entities = {User.class, Pet.class}, version = 2)

abstract class AppDatabase extends RoomDatabase {
public abstract Dao getDao();
public abstract Dao getPetDao();
}

Resterend zal hetzelfde zijn als je hierboven hebt vermeld-

 db = Room.databaseBuilder(this, AppDatabase::class.java, "your_db")
        .addMigrations(MIGRATION_1_2).build()

Referentie - Voor meer


0
2017-08-04 12:43



Sorry, Room biedt geen ondersteuning voor het automatisch aanmaken van tabellen zonder gegevensverlies.

Het is verplicht om de migratie te schrijven. Anders worden alle gegevens gewist en wordt de nieuwe tabelstructuur gemaakt.


-1
2017-08-04 11:37