Преобразование объекта в список [объект] в Realm в качестве миграции (Как я могу заменить список [объекты] полем объекта в Realm?)

Я хочу импортировать существующие token в tokenList в качестве первого элемента, например, если у кого-то есть token="abc" после migration, я хочу, чтобы у него/нее было tokenList, что tokenList[0]=="abc"

Это мой код миграции:

public class RealmMigration implements io.realm.RealmMigration {
.
.
.
    if (oldVersion == 3) {
        final RealmObjectSchema bankSchema = realmSchema.get("Bank");
        final RealmObjectSchema tokenSchema = realmSchema.get("Token");
        DynamicRealmObject bank = realm.createObject("Bank",1);
        Token token = bank.get("Token");
        bankSchema.addRealmListField("tokenList", tokenSchema);
        List<Token> tokenList = bank.get("tokenList");
        if (token != null) tokenList.add(token);
        bankSchema.removeField("Token");
    }
}

Я заменяю это в новой версии:

@RealmField(name = "tokenList")
private RealmList<Token> mTokenList;

С этим в старой версии в моем классе:

@RealmField(name = "Token")
private Token mToken;

person milad salimi    schedule 22.01.2020    source источник
comment
Так что не работает? Есть ли исключение и т.д.? Вы обновили номер версии схемы, чтобы инициировать миграцию?   -  person EpicPandaForce    schedule 25.01.2020
comment
Да, я обновляю его, миграция идет хорошо, но приложение вылетает, когда я устанавливаю новую версию на старую версию, потому что я не могу вставить существующий токен (старое поле в банке) в tokenList (новое поле в банке). java.lang.IndexOutOfBoundsException: Index: 0, Size: 0, потому что bankList не заполнен при миграции.   -  person milad salimi    schedule 25.01.2020


Ответы (1)


Я создал новую проблему в Realm GitHub, затем я нашел правильный способ преобразования object в list[object] в Realm и insert существующего объекта из предыдущей версии в новую версию приложения.

В этом примере мы хотим transform Token возражать против tokenList[Token] в модели Bank.

В последней версии миграции поместите это:

public class RealmMigration implements io.realm.RealmMigration {

.

.

.

        if (oldVersion == 3) {
            //Create a schema for Bank
            final RealmObjectSchema bankSchema = realmSchema.get("Bank");
            //Create a schema for Token that has been in Bank model
            final RealmObjectSchema tokenSchema = realmSchema.get("Token");
            //We use bankSchema for add tokenList field and transform
            bankSchema
                .addRealmListField("tokenList", tokenSchema)
                .transform((obj) -> {//obj is bank model,we have a transform in bank model
                         DynamicRealmObject token = obj.get("Token");
                         List<DynamicRealmObject> tokenList = obj.get("tokenList");
                                //We add token from pre version to tokenList in new version
                                if (token != null) tokenList.add(token);
                            }
                    )
                    //Finally remove unwanted field
                    .removeField("Token");
        }
}
person milad salimi    schedule 26.01.2020