Миграция Java Realm: свойство стало обязательным

Работает нормально для большинства новых установок, но после последнего обновления приложения приходит много отчетов с этой проблемой. Между обновлениями прошло некоторое время, поэтому я ДУМАЮ, что это может быть вызвано тем, что пользователи обновляют очень старую версию до того, как я добавил схему ... но другие говорят, что видели это при новой установке. Realm Java — это realm-gradle-plugin:5.1.1

Я ценю любую помощь, спасибо!

Ошибка:

Caused by io.realm.exceptions.RealmMigrationNeededException
Migration is required due to the following errors: - Property 'Loan.loanRatePct' has been made required.
...
...onCreate (Activity.java:168)

MyMigration.java

if (oldVersion == 0) {
    schema.get("Storage")
            .addField("heat", String.class);
    oldVersion++;
}

if (oldVersion == 1) {
    schema.get("Env")
            .addField("gameType", String.class);
    oldVersion++;
}

if (oldVersion == 2) {
    schema.get("Loan")
            .addField("loanRatePct", Double.class);
    schema.create("GameMode")
             .addField("md", String.class)
            .addField("name", String.class)
            .addField("days", int.class)
            .addField("term", int.class)
            .addField("rate", String.class)
            .addField("amount", int.class)
            .addField("icon", int.class);
    schema.create("Leaderboard")
            .addField("score", String.class);

    oldVersion++;
}

if (oldVersion == 3) {
    schema.get("Leaderboard")
            .addField("mode", String.class);
    oldVersion++;
}

Мое приложение.java

Realm.init(getApplicationContext());
    RealmConfiguration config = new RealmConfiguration.Builder()
            //todo: EVERY UPDATE: is new schema needed?
            .schemaVersion(4) // Must be bumped when the schema changes
            .migration(new MyMigration()) // Migration to run instead of throwing an exception
            .build();
    Realm.setDefaultConfiguration(config);

Activity.java

protected void onCreate(Bundle savedInstanceState) {    
    realm = Realm.getDefaultInstance();
    ...
}

Изменить: забыл:

Loan.java

public class Loan extends RealmObject {
    String theloan;
    int loan;
    int loanRate;
    double loanRatePct;
    int loanBalance;
}

person zngb    schedule 12.06.2018    source источник
comment
.addField("loanRatePct", Double.class); должно быть .addField("loanRatePct", double.class);   -  person EpicPandaForce    schedule 12.06.2018


Ответы (1)


Double означает nullable double.

double означает non-null double.

Так что .addField("loanRatePct", Double.class); должно быть .addField("loanRatePct", double.class);.

person EpicPandaForce    schedule 12.06.2018
comment
обратите внимание, что вам может потребоваться изменить версию схемы и проверить, допускает ли поле значение NULL, и если да, то setRequired("loanRatePct", true) - person EpicPandaForce; 12.06.2018
comment
Вам нужно использовать ::class.javaPrimitiveType для ненулевой версии в Котлине. - person EpicPandaForce; 14.08.2018
comment
Благодарю за разъяснение. Это работает. Для тех, кто ищет ответ, вы должны использовать примитивный тип данных вместо объекта во втором параметре. - person Aman Verma; 28.02.2019