只有@PrimaryKey的RealmObject

时间:2016-01-26 15:34:28

标签: android realm

我有返回对象列表的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)方法会更好。有没有?

1 个答案:

答案 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();