#android #android-sqlite #android-room #database-migration
#Android #android-sqlite #android-room #база данных-миграция
Вопрос:
Я пытаюсь использовать обновленную версию моей предварительно упакованной базы данных с fallbackToDestructiveMigration()
. Я также только что обновил версию Gradle Room до 2.2.5.
Теперь, во-первых, Room ошибочно воссоздал базу данных, поскольку она была полностью пуста. После ручного удаления данных в эмуляторе он извлекает базу данных из ресурсов, но я получаю ошибку схемы.
Использование https://hrankit.github.io/RoomSQLiteDifferenceFinder / Я вижу, что различия заключаются только в notNull
проверках некоторых столбцов:
Но я никогда не указывал, чтобы они были notNull
на первом месте:
public class Challenge {
@PrimaryKey(autoGenerate = true)
private int id = 0;
private final String name;
@NonNull
private final ChallengeType type;
private final String summary;
@NonNull
private final String content;
private final String activePartContent;
private final String helpContentWhy;
private final String helpContentHow;
private final String sources;
private boolean isActive;
private int experience;
private int neededAttempts;
public Challenge(String name, @NonNull ChallengeType type, String summary, @NonNull String content, String activePartContent, String helpContentWhy, String helpContentHow, String sources, boolean isActive, int experience, int neededAttempts) {
this.name = name;
this.type = type;
this.summary = summary;
this.content = content;
this.activePartContent = activePartContent;
this.helpContentWhy = helpContentWhy;
this.helpContentHow = helpContentHow;
this.sources = sources;
this.isActive = isActive;
this.experience = experience;
this.neededAttempts = neededAttempts;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
@NonNull
public ChallengeType getType() {
return type;
}
@NonNull
public String getContent() {
return content;
}
public String getActivePartContent() {
return activePartContent;
}
public String getHelpContentWhy() {
return helpContentWhy;
}
public String getHelpContentHow() {
return helpContentHow;
}
public boolean isActive() {
return isActive;
}
public String getSummary() {
return summary;
}
public String getSources() {
return sources;
}
public int getExperience() {
return experience;
}
public int getNeededAttempts() {
return neededAttempts;
}
}
Итак, почему комната беспокоит меня этим. И я не хочу просто устанавливать эти значения на notNull
в моем файле db, потому что это не имеет смысла. С таким же успехом можно было бы иметь буквально все, что не равно Null.
Кроме того, я помню, что сталкивался с этой проблемой перед попыткой миграции, когда я попытался следовать и установить для требуемых полей значение NotNull, Room просто нашел бы другую таблицу, чтобы пожаловаться на NotNull. Вот почему я так долго избегал обновления номера версии Gradle, поскольку, казалось, это происходит оттуда.
Комментарии:
1. Да, как и ожидалось, изменение этих значений на true по желанию Room приводит только к переходу к другой таблице, где она делает то же самое. И там это буквально каждый отдельный столбец. У меня есть подозрение, что это делается только для тех вновь созданных столбцов в версии 2 БД, потому что в новой таблице все столбцы отмечены этим.
2. Ну, после того, как я не смог найти никакого другого решения, я изменил все эти случайные столбцы на
notNull = true
, и это решило проблему. По какой-то причине в основном это были целые числа и логические значения.