Room — «Предварительно упакованная база данных имеет недопустимую схему» — случайным образом требуется, чтобы столбцы были ненулевыми

#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 , и это решило проблему. По какой-то причине в основном это были целые числа и логические значения.