【问题标题】:How to add existing objects on a new class on Realm Migration in Android如何在 Android 的 Realm Migration 上的新类上添加现有对象
【发布时间】:2018-05-31 14:58:22
【问题描述】:

我有一个正在生产的应用,因此必须使用 RealmMigration 应用更改

我查看了文档和example,但没有找到以下操作。

在当前版本中,我有 Foo 类型的项目,它具有一个名为 favoriteboolean 属性。 现在我想概括一下并创建用户自定义Foo 列表,这样用户就可以创建他们的自定义列表并添加任意数量的对象。 我想用一个名为UserFooList 的新类来实现这一点,它基本上包含nameRealmList<Foo>of 元素。

在迁移过程中,我正在使用它的字段创建这个新类。

这很容易,但困难的部分来了:

我想将所有以前标记为favoriteFoo 项目添加到新的UserFooList,然后删除现在未使用的Foo 的字段favorite


一些代码有助于澄清:

当前班级

public class Foo extends RealmObject{

    private String title;
    private boolean favorite;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public boolean isFavorite() {
        return favorite;
    }

    public void setFavorite(boolean favorite) {
        this.favorite = favorite;
    }
}

已更改课程

public class Foo extends RealmObject{

    //favorite field will be removed
    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

新课程

public class UserFooList extends RealmObject{

    private String name;
    private RealmList<Foo> items;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public RealmList<Foo> getItems() {
        return items;
    }

    public void setItems(RealmList<Foo> items) {
        this.items = items;
    }
}

我想插入一个UserFooList 实例并填充它:

  • name: "收藏夹"
  • items:所有现有的Foo 实例与favorite == true

我想在迁移期间执行此操作,因为这样我将能够在将所有元素插入新创建的列表后删除 favorite 字段。

【问题讨论】:

  • 如果你添加你想要的以前的模型和新的模型,我就能知道你想给你的字段取什么名字
  • @EpicPandaForce 感谢您的评论,我编辑了我的答案,试图用一些示例代码更好地解释它。

标签: android realm realm-migration


【解决方案1】:

依靠 DynamicRealm API 的强大功能。

public class MyMigration implements Realm.Migration {    
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();
        if(oldVersion == 0) {
            RealmObjectSchema foo = schema.get("Foo");
            RealmObjectSchema userFooList = schema.create("UserFooList");
            userFooList.addField("name", String.class);
            userFooList.addRealmListField("items", foo);

            DynamicRealmObject userList = realm.createObject("UserFooList");
            userList.setString("name", "favorites");
            RealmList<DynamicRealmObject> listItems = userList.getList("items");
            RealmResults<DynamicRealmObject> favoriteFoos = realm.where("Foo").equalTo("favorite", true).findAll();
            for(DynamicRealmObject fooObj: favoriteFoos) {
                listItems.add(fooObj);
            }
            foo.removeField("favorite");
            oldVersion++;
        }
    }

    @Override public boolean equals(Object object) { 
        return object != null && object instanceof MyMigration;
    }

    @Override public int hashCode() {
        return MyMigration.class.hashCode();
    }
}

【讨论】:

  • 有趣的是,我认为我不必用这种级别的 api 回答迁移问题,所以在过去 3 年之后这很有趣。哈哈
  • 谢谢。是的,这有点棘手。我很高兴这个很棒的 api 可以做到这么简单。
  • @EpicPandaForce ,请查看stackoverflow.com/questions/59855380/...关于领域迁移
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
相关资源
最近更新 更多