我有返回对象列表的API。这些对象与另一个对象有关系。但API只返回它们的ID。为了获得完整的对象,我必须使用另一个API。例如:
class Owner extends RealmObject {
...
RealmList<Cat> cats;
}
class Cat extends RealmObject {
@PrimaryKey
String id;
String name;
}
所以当我收到Owner
的列表时,我将它们存储在数据库中,如下所示:
for (OwnerDto o : owners) {
Owner owner = new Owner();
...
RealmList<Cat> catsList = new RealmList<>();
for (Cat c : o.cats) {
Cat cat = new Cat();
cat.setId(c.id);
catsList.add(cat);
}
owner.setCats(catsList);
realm.copyToRealmOrUpdate(owner);
}
但是在这种情况下所有的猫都会这样做。如果以前填充了名称,则会被删除。
是否可以仅使用ID创建RealmObject以设置关系,并使用日期后缀填充它?或者仅指定与Id的关系?还是其他任何解决方案?
更新: 我想出了这样的解决方案:
for (OwnerDto o : owners) {
Owner owner = new Owner();
...
RealmList<Cat> catsList = new RealmList<>();
for (Cat c : o.cats) {
Cat cat = realm.where(Cat.class)
.equalsTo("id", c.id)
.findFirst();
if (cat == null) {
cat = new Cat();
}
cat.setId(c.id);
catsList.add(cat);
}
owner.setCats(catsList);
realm.copyToRealmOrUpdate(owner);
}
Here我发现有一个方法realm.objectForPrimaryKey(User.self, key: "key")
用于swift但我没有资助java版本的模拟。
在这种情况下,使用realm.getOrCreate(Cat.class, c.id)
方法会更好。有没有?
答案 0 :(得分:0)
如果你想要将它们链接在一起之前没有整个对象,那么这样做非常粗糙,因为你不能只存储RealmList<T>
个原语,只有RealmList<T extends RealmObject>
。< / p>
所以你的选择是:
1。)让您的王国中有猫,然后下载Owner
,并将其与领域查询一起打包。
realm.beginTransaction();
Owner owner = new Owner();
owner.setCats(new RealmList<Cat>());
for(int i = 0; i < listOfCats.size(); i++) {
String id = listOfCats.get(i);
Cat cat = realm.where(Cat.class).equalTo("id", id).findFirst();
owner.getCats().add(cat);
}
realm.commitTransaction();
2。)有RealmList<RealmString>
存储ID。
public class RealmString extends RealmObject {
private String value;
public String getValue() { return value; }
public void getValue(String value) { this.value = value; }
}
之后你可能需要使用一些丑陋的查询。
RealmResults<Owner> ownerOfCat = realm.where(Owner.class)
.equalTo("catIds.value", catId).findAll();