【问题标题】:Transform an object to a list[object] in Realm as migration ( How can i replace a list[objects] with object field in Realm? )将对象转换为领域中的列表 [对象] 作为迁移(如何将列表 [对象] 替换为领域中的对象字段?)
【发布时间】:2020-01-22 08:23:27
【问题描述】:

我想将现有的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;

【问题讨论】:

  • 那么什么不起作用?有没有例外之类的?您是否更新了架构版本号以触发迁移?
  • 是的,我更新了它,迁移很好,但是当我在旧版本上安装新版本时应用程序崩溃,因为我无法将现有令牌(银行中的旧字段)插入 tokenList(银行中的新字段).java。 lang.IndexOutOfBoundsException: Index: 0, Size: 0 因为 bankList 未填写迁移。

标签: java android kotlin realm realm-migration


【解决方案1】:

我在 Realm GitHub 中创建了新的 issue 然后我找到了 transformobjectlist[object] 的正确方法>领域insert从以前版本到新版本应用程序的现有对象。

在本例中,我们希望在Bank 模型中将transform Token 对象 转换为tokenList[Token]

在迁移的最后一个版本中放这个:

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");
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多