Миграция базы данных комнаты не обрабатывает должным образом миграцию ALTER TABLE

Java.ленг.IllegalStateException

миграция не обработана должным образом пользователей(therealandroid.на GitHub.ком.roomcore.Ява.Пользователя).

ожидается:

TableInfo{имя= "пользователь", столбцы={имя=столбец{имя='' введите текст='', notNull=false, primaryKeyPosition=0}, age=столбец{name= 'age', type= 'INTEGER', notNull=true, primaryKeyPosition=0}, id=столбец{name= 'id', type= 'INTEGER', notNull=true, primaryKeyPosition=1}}, foreignKeys=[]} найдено:

нашел

TableInfo{ имя= "пользователь", столбцы={имя=столбец{имя='' введите текст='', notNull=false, primaryKeyPosition=0}, id=столбец{name= 'id', type= 'INTEGER', notNull=true, primaryKeyPosition=1}, age=столбец{name= 'age', type= 'INTEGER', notNull=false, primaryKeyPosition=0}}, foreignKeys=[]}

я пытаюсь выполнить простую миграцию, у меня есть класс с именем Userи у него есть два столбца ID (primary key) и NAME TEXT и затем я заполняю базу данных двумя данными пользователей, затем добавляю столбец AGE на объекте User и в константе миграции я добавляю alter table чтобы добавить этот новый столбец и, наконец, заменить версию базы данных 1 на 2.

здесь код

пользователей.класс!--15-->

@Entity(tableName = "user")
  public class User {

  @PrimaryKey
  private int id;

  @ColumnInfo(name = "name")
  private String name;

  @ColumnInfo(name = "age")
  private int age;


  public int getId() {
      return id;
  }

  public void setId(int id) {
      this.id = id;
  }

  public String getName() {
      return name;
  }

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

  public int getAge() {
      return age;
  }

  public void setAge(int age) {
      this.age = age;
  }
}

класс База данных

@Database(entities = {User.class}, version = 2)
public abstract class RoomDatabaseImpl extends RoomDatabase {
    abstract UserDao userDao();
}

миграция код

public static Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE 'user' ADD COLUMN 'age' INTEGER");
    }
 };

и это называют

Room.databaseBuilder(context, RoomDatabaseImpl.class, "Sample.db")
            .addMigrations(MIGRATION_1_2)
            .allowMainThreadQueries()
            .build();

перед изменением добавления объекта AGE и выполняя миграцию, я добавляю два регистра, и он работает.

после выполнения миграции, я просто пытался добавить нового пользователя, как показано ниже:

  User user = new User();
  user.setName("JoooJ");
  user.setId(3);
  user.setAge(18);

  List<User> userList = new ArrayList<>();
  userList.add(user);
  App.database(this).userDao().insertAll(userList);  // The crash happens here

прочая информация:

Android Studio 3, и я не тестировал в фактическом.

зависимости:

compile "android.arch.persistence.room:runtime:1.0.0-alpha9-1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha9-1"

compile "android.arch.persistence.room:rxjava2:1.0.0-alpha9-1"
gradle 2.3.3

может кто-нибудь помочь мне, пожалуйста, я действительно не знаю, что я делаю неправильно или если это ошибка.

2 ответов


сообщение об ошибке трудно разобрать, но есть разница:

TableInfo{имя= "пользователь", столбцы={имя=столбец{имя='имя', тип='текст', notNull=false, то primaryKeyPosition=0}, возраст=столбец{имя='возраст', тип='целое', notNull=true, primaryKeyPosition=0}, id=столбец{name= 'id', type= 'INTEGER', notNull=true, primaryKeyPosition=1}}, foreignKeys=[]} найдено:

нашел

TableInfo{ name= 'user', столбцы={имя=столбец{имя='имя', тип='текст', notNull=false, то primaryKeyPosition=0}, ИД=столбец{имя='идентификатор', тип='целое', notNull=true, то primaryKeyPosition=1}, Возраст=столбец{имя='возраст', тип='целое', notNull=false, primaryKeyPosition=0}}, foreignKeys=[]}

возраст аннулируется, но комната ожидала, что он не будет нулевым.

измените миграцию на:

database.execSQL("ALTER TABLE 'user' ADD COLUMN 'age' INTEGER NOT NULL");

Так как это объяснение исключения очень трудно разбор, я создал небольшой скрипт это делает разницу для вас.

пример:

mig "java.lang.IllegalStateException: Migration failed. expected:TableInfo{name='user', columns={name=Column{name='name', type='TEXT', notNull=false, primaryKeyPosition=0}, age=Column{name='age', type='INTEGER', notNull=true, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}}, foreignKeys=[]} , found:TableInfo{name='user', columns={name=Column{name='name', type='TEXT', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', notNull=true, primaryKeyPosition=1}, age=Column{name='age', type='INTEGER', notNull=false, primaryKeyPosition=0}}, foreignKeys=[]}"

результат:

expected/found diff


Я тоже написал небольшой скрипт JS, который вы можете найтиhttps://hrankit.github.io/RoomSQLiteDifferenceFinder/

процесс довольно простой.

  1. введите ожидаемый журнал ошибок в ожидаемый столбец, который является левым.

  2. введите найденный журнал ошибок в найденном столбце, который является правильным.

  3. Нажмите Go. кнопка. Журналы ошибок преобразуются в формат JSON.

  4. Нажмите кнопку Сравнить и вуаля, у вас есть разница нужно.

этот плагин обнаруживает разницу в двух ожидаемых и найденных дамп из Android Studio Logcat. оформить изображение сравнения здесь