2015-10-15 3 views
5

Ich muss eines meiner Modellobjekte (die von Json automatisch mit Retrofit gefüllt wurden) in ein Realm-Objekt konvertieren.So erstellen Sie ein neues RealmObject, das eine RealmList enthält

Zuerst war mein Code new RealmPoll() anstelle von realm.createObject(RealmPoll.class). (Ich bekam NullPointerException genau wie this question) Also löste ich dieses Problem. Aber ich kann keine Möglichkeit finden, eine RealmListe zu kopieren.

Ich kann keine Beispiele für das Erstellen RealmObjects mit RealmLists im official Realm website tutorial und die docs sagen

Nur Realm verwaltet RealmLists schaffen finden. Verwaltete RealmLists aktualisieren den Inhalt automatisch , wenn das zugrunde liegende Realm aktualisiert ist und nur mit dem Getter eines RealmObject zugegriffen werden kann.

was macht mich glauben, dass es irgendwie nicht möglich ist? Aber es ist eine wirklich einfache Aufgabe. Ich weiß nicht, wie ich die Bedeutung der Dokumente interpretieren soll.

Gibt es eine Möglichkeit, ein Objekt (z. B. RetrofitPoll unten) nur in ein Realm-Objekt (z. B. RealmPoll) zu konvertieren, wenn es eine Liste enthält?

Eine Funktion, die meine Frage stellt:

private RealmPoll convertRetrofitPollToRealmPoll(Realm realm, RetrofitPoll retrofitPoll) 
{ 
    RealmPoll realmPoll = realm.createObject(RealmPoll.class); //<----- fixed, used to be "new RealmPoll()". 

    //Convert List<Answer> 
    RealmList<RealmAnswer> realmAnswers = new RealmList<RealmAnswer>(); //<----- How to do same thing here? 
    for(RetrofitAnswer retrofitAnswer : retrofitPoll.getAnswers()) 
    { 
     realmAnswers.add(convertRetrofitAnswerToRealmAnswer(retrofitAnswer)); 
    } 
    realmPoll.setAnswers(realmAnswers); 
} 

RetrofitPoll.java

public class RetrofitPoll 
{ 
    private List<Answer> answers; 
    private String id; 
    private Date startDate; 
    private String title; 
    private Topic topic; 
} 

RealmPoll.java

public class Poll extends RealmObject 
{ 
    private RealmList<Answer> answers; 
    private String id; 
    private Date startDate; 
    private String title; 
    private Topic topic; 
} 

Antwort

6

Es sollte möglich sein, die folgenden

ObjectWithList obj = new ObjectWithList(); 
RealmList<Foo> list = new RealmList(); 
list.add(new Foo()); 
obj.setList(list); 

realm.beginTransaction(); 
realm.copyToRealm(obj); // This will do a deep copy of everything 
realm.commitTransaction(); 

zu tun Wenn Sie Retrofit verwenden, um Ihr gesamtes Objekt-Diagramm zu erstellen, sollten Sie in der Lage sein, alles in Realm kopieren nur ein einen Einzeiler verwenden. Wenn nicht, ist es ein Fehler.

Hinweis: Dies ist auch in der Dokumentation:

* Non-managed RealmLists can be created by the user and can contain both managed and non-managed 
* RealmObjects. This is useful when dealing with JSON deserializers like GSON or other 
* frameworks that inject values into a class. Non-managed elements in this list can be added to a 
* Realm using the {@link Realm#copyToRealm(Iterable)} method. 

Non-Managed-Listen erstellt werden, indem nur new RealmList() tun, aber dies könnte wahrscheinlich in der Dokumentation klarer.