如何在Android中的Realm Migration上添加新类上的现有对象

时间:2018-05-31 14:58:22

标签: android realm realm-migration

我有一个关于制作的应用,因此必须使用RealmMigration

进行更改

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

在当前版本中,我有Foo类型的项目,其boolean属性名为favorite。 现在我想概括一下并创建用户自定义Foo列表,这样用户就可以创建自定义列表并添加任意数量的对象。 我希望使用一个名为UserFooList的新类来实现此功能,该类基本上包含nameRealmList<Foo>个元素。

在迁移过程中,我创建了这个带有字段的新类。

这很容易,但这里有困难的部分:

我想将标有Foo的所有先前favorite项添加到新的UserFooList,然后删除现在未使用的Foo字段{{1 }}

一些有助于澄清的代码:

当前班级

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:&#34;收藏夹&#34;
  • nameitems
  • 的所有现有Foo个实例

我希望在迁移期间执行此操作,因为这样我可以在新创建的列表中插入所有元素后删除favorite == true字段。

1 个答案:

答案 0 :(得分:5)

依靠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();
    }
}