android - 如何在 Android 的 Realm Migration 上的新类上添加现有对象
问题描述
我有一个生产应用程序,因此必须使用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
在新创建的列表中插入所有元素后删除字段。
解决方案
依靠 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();
}
}
推荐阅读
- php - PHP:将存储在 $_FILES 中的上传文件重新提交/转发到另一个脚本
- python - 使用 Selenium 获取 HTML 的某些元素
- html - 防止href在组件内点击onclick
- python - 在python中将二进制字符串数据转换为十六进制
- azure - 使用 azure cli 启动解除分配的 VM (3-6) 大约需要半小时
- java - 如何在firebase数据库中找到最新节点
- javascript - 从 URL 参数中获取 id
- google-cloud-storage - Gsutil 批量复制/移动文件
- javascript - 如何在没有 SSL/TLS 的情况下加密数据客户端并在另一个客户端解密?
- android - 配置更改后 Koin 更新 Android 上下文