Миграция базы данных комнаты не обрабатывает должным образом миграцию 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=[]}"
результат:
Я тоже написал небольшой скрипт JS, который вы можете найтиhttps://hrankit.github.io/RoomSQLiteDifferenceFinder/
процесс довольно простой.
введите ожидаемый журнал ошибок в ожидаемый столбец, который является левым.
введите найденный журнал ошибок в найденном столбце, который является правильным.
Нажмите Go. кнопка. Журналы ошибок преобразуются в формат JSON.
Нажмите кнопку Сравнить и вуаля, у вас есть разница нужно.
этот плагин обнаруживает разницу в двух ожидаемых и найденных дамп из Android Studio Logcat. оформить изображение сравнения здесь