Я столкнулся со следующей проблемой.
У меня есть класс, который я хочу сохранить в области.В этом классе у меня есть вложенный объект области, скажем, 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");
, оно ВСЕГДА возвращает ноль , и я не могу установить поля нового объекта, и приложение вылетает.
Согласно полученному мною ответу, он должен был вернуть не ноль, а ссылку на вновь созданный объект.К сожалению, этого не происходит.Может быть, я что-то упускаю или делаю что-то не так.
Спасибо за помощь