5

現在のアプリでは、 「machineId」を持つHolderObject(を拡張RealmObjectする) があります。longアプリの新しいバージョンではHolderObject、RealmList の形式でより多くのマシンを含めることができます。以下のクラスを参照してください。

古いオブジェクト:

public class HolderObject extends RealmObject{
    private long machineId;
    //.. getters and setters
}

新しいオブジェクト:

public class HolderObject extends RealmObject{
    private RealmList<RealmLong> machineIds;
    //.. getters and setters
}

その中RealmLongは次のとおりです。

public class RealmLong extends RealmObject {
    private long val;
    //.. getters and setters
}

すべての古いHolderObjectを新しいオブジェクトに移行するには、カスタム RealmMigration を使用します。これは次のとおりです。

public class CustomRealmMigration implements RealmMigration {
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();

        schema.get("HolderObject")
                .addRealmListField("machineIds", schema.get("RealmLong"))
                .transform(new RealmObjectSchema.Function() {
                    @Override
                    public void apply(DynamicRealmObject obj) {
                        Realm realm = Realm.getDefaultInstance();
                        realm.beginTransaction();
                        RealmLong realmLong = realm.createObject(RealmLong.class);
                        realmLong.setVal(obj.getLong("machineId"));
                        obj.getList("machineIds").add(realmLong);
                        realm.commitTransaction();
                        realm.close();
                    }
                });
    }
}

質問:

  • の行obj.getList("machineIds").add(realmLong);で、この関数はDynamicRealmObjectではなく を期待しているというエラーが表示されますRealmLongRealmLongこのリストに を追加するにはどうすればよいですか?
  • (おまけの質問)これは、この移行の問題に対する正しい最善のアプローチですか?
4

1 に答える 1

6

次のようにします。

schema.get("HolderObject")
        .addRealmListField("machineIds", schema.get("RealmLong"))
        .transform(new RealmObjectSchema.Function() {
            @Override
            public void apply(DynamicRealmObject obj) {
                DynamicRealmObject realmLong = realm.createObject("RealmLong");
                realmLong.setLong("val", obj.getLong("machineId"));
                obj.getList("machineIds").add(realmLong);
            }
        })
        .removeField("machineId");

作成する realmLong オブジェクトは DynamicRealmObject でなければなりません。
また、変換後に古いフィールドを削除することを忘れないでください。

移行はすでにトランザクションにラップされていることに注意してください。レルム オブジェクトをインスタンス化し、自分でトランザクションを実行する必要はありません。

(おまけの質問) これは、この移行の問題に対する正しい最善のアプローチですか?

アイデアはよいが、実行はそうではない。上記を参照。

移行に関する追加情報については、github のこの例と、もちろんドキュメントを参照してください。

于 2016-06-06T11:54:08.150 に答える