Миграция области Android: переключение вложенного объекта с другим объектом, оба объекта расширяют RealmObject - PullRequest
0 голосов
/ 29 июня 2019

Я столкнулся со следующей проблемой.

У меня есть класс, который я хочу сохранить в области.В этом классе у меня есть вложенный объект области, скажем, CoinA, который я хочу переключить с CoinB.

class Transaction extends RealmObject {
    @PrimaryKey
    private int id;

    private CoinA coin;

    ... // more fields

class CoinA extends RealmObject implements Parcelable {
   @PrimaryKey
   private int id; 

   private String urlSourceToCCCoin;

   ...// more fields

class CoinB extends RealmObject implements Parcelable {
   @PrimaryKey
   private String id;

   private String imageUrl;

   ...//and may more fields different than fields from CoinA

Ожидаемый класс:

class Transaction extends RealmObject {
    @PrimaryKey
    private int id;

    private CoinB coin;

    ... // more fields

Я был совершенно уверен, что следующее будет работатьно это не так.Я нашел ответ довольно близко к тому, что искал, но он не сработал для меня.Следуя логике, показанной в Поле области переноса типа double в новый подобъект со значениями

class NewRealmMigration extends RealmMigration {

@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion){
        RealmSchema realmSchema = realm.getSchema();
        // Building the schema for CoinB
        RealmObjectSchema coinBObjectSchema = realmSchema.create("CoinB")
                .addField("id", String.class)
                .addField("imageUrl", String.class)
                ... //more fields

        realmSchema.get("Transaction")
                .addRealmObjectField("coin_tmp", coinBObjectSchema)
                .transform(new RealmObjectSchema.Function() {
                    @Override
                    public void apply(DynamicRealmObject realmObject) {
                        DynamicRealmObject coinA = realmObject.getObject("coin");
                        DynamicRealmObject coinB = realmObject.getObject("coin_tmp");

                        coinB.setString("id", String.valueOf(coinA.getInt(ID)));
                        coinB.setString("imageUrl", coinA.getString("sourceImageUrl"));
                        ... //more fields
                    }
                })
                .removeField("coin")
                .renameField("coin_tmp", "coin");
    }
}

Я ожидал, что вышеописанная миграция будет работать, но это не так.Несмотря на добавление .addRealmObjectField("coin_tmp", coinBObjectSchema) в блок метода преобразования при вызове DynamicRealmObject coinB = realmObject.getObject("coin_tmp");, оно ВСЕГДА возвращает ноль , и я не могу установить поля нового объекта, и приложение вылетает.

Согласно полученному мною ответу, он должен был вернуть не ноль, а ссылку на вновь созданный объект.К сожалению, этого не происходит.Может быть, я что-то упускаю или делаю что-то не так.

Спасибо за помощь

...