2017-02-23 4 views
3

Wenn Sie Realm und Retrofit2 zum Senden von automatisch verwalteten RealmObjects an unseren Server verwenden, sendet Retrofit2 (mit Gson) nur die Ints im RealmObject. Es ignoriert vollständig die Strings und andere Felder und legt diese nicht in den JSON. Es werden keine Fehler protokolliert. jedochRealm und Retrofit2: Senden automatisch verwalteter Objekte

Wenn ich die RealmObject von Realm trennen:

realm.copyFromRealm(myRealmObject) 

dann ist es alle Felder senden. Was könnte das Problem sein? Gibt es eine richtige Lösung?

Antwort

2

Bevor wir in

In einem meiner Beiträge hier auf Stackoverflow tauchen, habe ich erklärt, was passiert, wenn Gson und Realm mit zusammen (Retrofit wird mit nur Gson als Datenkonverter, so ist es Gson wer versagt nicht nachrüsten). Der Link ist unten aufgeführt.

tauchen Lassen Sie uns in

... sendet nur die Ints im RealmObject

Nope! Nicht nur ints ...

Wenn Sie genau hinsehen, werden Sie feststellen, dass auch Ihre ints auf 0 gesetzt (das ist der null Wert für ein int). Das Gleiche würde mit einem boolean passieren, würden Sie false in der serialisierten Ausgabe erhalten.

Die Sache ist die, dass alle Ihre RealmObject Attribute null gesetzt werden, wenn die gleichen realmObject verwaltet wird. Wenn Sie versuchen, ein Attribut zu lesen/schreiben (von einem verwalteten realmObject), liest/schreibt Realm seinen Wert von/auf die Persistenzschicht (unter Verwendung von proxies), so dass Sie sicher sind, dass Sie den richtigen Wert dieser realmObject erhalten/setzen (nicht nur einen alten Wert aus dem Speicher zu bekommen).

Das gesagt, ich kann jetzt erklären, warum Gson nur Serialisierung ints ist.

  • Wenn Ihr Attribut ein object ist, wird sein Wert auf null gleich sein (eine Referenz zeigt nirgendwo) und Gson wird sich nicht die Mühe es Serialisierung (Sie werden nicht in der Ausgabe sehen).

  • Wenn Ihr Attribut eine Art Scaler ist (char, int, boolean, float ...) sein Wert gleich sein, was auch immer entspricht ein null (jedes Bit in dem Skalare 0) und Gson es wird serialisiert Ursache es gilt als ein gültiger Wert. Dies erklärt, warum nur Ihre ints serialisiert sind.

Wenn ich aber die RealmObject von Realm trennen ... dann ist es alle Felder senden.

Wenn Ihre realmObjectunmanaged ist wird es ein normales Java-Objekt handelt (keine Proxies verwendet werden, um die Kohärenz zwischen dem Objekt im Speicher und hielt einen aufrechtzuerhalten) und natürlich Gson wird es keine Schwierigkeiten haben, die Serialisierung .

Gibt es eine richtige Lösung?

Es gibt Problemumgehungen. In dem Beitrag, den ich bereits erwähnt habe, habe ich versucht, einige empfohlene (IMO) zu sammeln, um diese Inkompatibilität zu beheben. Hier ist der Link: "Android: Realm + Retrofit 2 + GSON".

+1

Dank @AnixPasBesoin –

+0

weitere Infos hier: https://medium.com/@ffvanderlaan/realm-auto-updated-objects-what-you-need-to-know-b2d769d12d76#.yvpvsft1d – Frank

0

Ihr Code realm.copyFromRealm(myRealmObject) eine RealmObject zu einem normalen Objekt (POJO) ändern, sagte Dokument macht einen nicht verwalteten In-Memory-Kopie eines bereits beharrte RealmObject (obwohl Sie depth Parameter definieren können.)

Mit Retrofit2 , jetzt unterstützen nur normale Objekte, ich denke, Ihre Codes sind absolut korrekt, aber GSON liest Feldwerte für die Serialisierung, und verwaltete Realm-Proxys haben alle null Felder (lesen Sie here).

Ändern Sie RealmObject zu normalen Java-Objekt mit realm.copyFromRealm() und senden Sie es an den Server.

+0

Dank @EpicPandaForce –

Verwandte Themen