Как добавить существующие объекты в новый класс в Realm Migration в Android - PullRequest
0 голосов
/ 31 мая 2018

У меня есть приложение на производстве, поэтому изменения должны быть применены с RealmMigration

Я посмотрел документацию и этот пример , но не нашел, каквыполните следующие действия.

В текущей версии у меня есть элементы типа Foo, у которых есть свойство boolean с именем favorite.Теперь я хочу обобщить это и создать пользовательские пользовательские списки Foo, чтобы пользователи могли создавать свои пользовательские списки и добавлять столько объектов, сколько они хотят.Я хочу реализовать это с помощью нового класса UserFooList с элементами name и RealmList<Foo> элементов.

В процессе миграции я создаю этот новый класс с его полями.

Это просто, но тут возникает сложная часть:

Я хочу добавить все предыдущие Foo элементы, отмеченные favorite, к новому 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 после вставки всех элементов в новый созданный список.

1 Ответ

0 голосов
/ 31 мая 2018

Положитесь на силу API DynamicRealm.

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