2016-01-26 4 views
1

У меня есть API, который возвращает список объектов. Эти объекты имеют отношения к другим объектам. Но API возвращает только идентификаторы для них. Чтобы получить полный объект, я должен использовать другой API. Например:RealmObject с @PrimaryKey только

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

, но в этом случае все имена котов будут удалены, если они были заселены раньше.

Возможно ли создать объект RealmObject с идентификатором только для того, чтобы установить отношение и заполнить его датами даты? Или указать только отношение с идентификатором? Или любое другое решение?

UPDATE: Я придумал решение, как это:

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") для быстры, но я не финансировал аналог в Java версии.

Было бы неплохо иметь в этой ситуации что-то вроде realm.getOrCreate(Cat.class, c.id) метода. Есть ли ?

+1

Благодарим за предложение! Я создал проблему для отслеживания улучшения. https://github.com/realm/realm-java/issues/2166 – beeender

+0

Я создал вспомогательный класс для поиска объектов по ключу (но он не будет их создавать, он не будет возвращен null): http: //stackoverflow.com/a/38136597/285678 – Loudenvier

ответ

0

Это очень грубо, если вы не имеете целых объектов, прежде чем хотите связать их вместе, потому что вы не можете просто сохранить RealmList<T> примитивов, только RealmList<T extends RealmObject>.

Так что ваши варианты:

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>, в котором вы храните идентификаторы.

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