Speichern von untergeordneten Sammlungen mit OrmLite auf Android mit Objekten, die von Jackson erstellt wurden

Lesezeit: 3 Minuten

Benutzer-Avatar
Jonathan Ellis

Ich habe einen REST-Dienst, den ich von meiner App aus aufrufe, der ein JSON-Objekt als byte[] das wird dann in eine schöne verschachtelte Sammlung von Objekten umgewandelt – all das funktioniert gut. Was ich dann tun möchte, ist, diese Objekte mit OrmLite im SQLite-Speicher zu speichern, und hier beginnen die Dinge zusammenzubrechen, da OrmLite, wie ich verstehe, nicht automatisch verschachtelte Objekte beibehält.

Lassen Sie uns der Einfachheit halber meine eigentliche Funktionalität entfernen und meine Objekte einfach wie folgt modellieren:

@DatabaseTable(tableName = "parents")
public class Parent {

    @DatabaseField(id=true)
    private String name;

    @ForeignCollectionField
    // have to use Collection here because needs to be compatible with Jackson
    private Collection<Child> children; 

    /* Getters and setters go here */
}

@DatabaseTable(tableName = "children")
public class Child {

    @DatabaseField(id=true)
    private String name;

    @DatabaseField(foreign=true)
    private Parent parent;

    /* Getters and setters go here */
}

Was passiert ist, dass beim Hinzufügen ein neues erstellt wird Parent Objekt in der Datenbank mit meinem entsprechenden parentDao -Objekt werden die untergeordneten Elemente nicht zusammen mit dem übergeordneten Element beibehalten.

Dies ist eine häufig gestellte Frage und wurde bereits früher gestellt. Es gibt definitiv andere Fragen zu SO, die dieser sehr ähnlich sind, insbesondere das Speichern verschachtelter Fremdobjekte mit ORMLite auf Android, als Antwort darauf schlägt Gray vor, das untergeordnete Objekt vor dem übergeordneten Objekt zu erstellen würde gut funktionieren, um meine POJOs manuell zu erstellen.

Ich habe jedoch noch keine Antwort gesehen, welche Faktoren in Fällen auftreten, in denen die Objekte von einer anderen Bibliothek (in diesem Fall Jackson) generiert werden. Ohne tiefer in Jacksons Innereien der Deserialisierung einzutauchen (was den ganzen Vorteil seiner Einfachheit aufhebt) und zu versuchen, Jackson dazu zu bringen, die untergeordneten Objekte zu erstellen und sie dann dem übergeordneten Objekt hinzuzufügen (es sei denn, ich vermisse etwas und das ist einfacher als es klingt?) das scheint in diesem speziellen Fall keine besonders attraktive Lösung zu sein.

Ebenso gibt es andere Lösungen, bei denen dem Fremdschlüssel weitere Anmerkungen hinzugefügt werden, die für die Arbeit mit einzelnen untergeordneten Objekten geeignet erscheinen, aber diese Anmerkungen sind beim Arbeiten mit nicht verfügbar @ForeignCollectionFields und ihre entsprechenden Collections.

  • Nur neugierig, wie Sie es denken sollte Arbeit? Es scheint übertrieben zu sein, immer zu versuchen, alle untergeordneten Objekte jedes Mal zu erstellen, wenn Sie ein übergeordnetes Objekt erstellen.

    – Grau

    21. Juni 2013 um 15:46 Uhr

  • Wäre gut, wenn es einen Parameter gäbe, der an die übergeben werden könnte @ForeignCollectionField Anmerkung, die angeben würde, dass untergeordnete Objekte beibehalten werden sollen. Die Lösung “Erstellen von Kindern vor Eltern” funktioniert einfach nicht für die Top-Down-Objekterstellung wie Jackson (es sei denn, es gibt eine andere Herangehensweise, die ich vermisse?)

    – Jonathan Ellis

    22. Juni 2013 um 23:45 Uhr


  • Ein guter Ansatz ist, mit Jackson in einem String-Feld (verknüpft) als JSON zu serialisieren und das vollständige Objekt zu speichern. Oder wenn Sie eine Abfrage für verschachtelte Objekte durchführen möchten, speichern Sie Schlüssel und separate Objekte. Wenn Sie weitere Informationen zu dieser Antwort wünschen, sagen Sie es mir. Ich antworte dann.

    – jeorfevre

    4. April 2016 um 22:07 Uhr


Vielleicht möchten Sie versuchen, eine ForeignCollection anstelle einer Collection in Ihrer übergeordneten Klasse zu verwenden.

Aus der ORMLite-Dokumentation:

„Die fremden Sammlungen unterstützen die add()- und remove()-Methoden. In diesem Fall werden die Objekte sowohl zur internen Liste hinzugefügt als auch daraus entfernt, wenn die Sammlung eifrig ist, und DAO-Aufrufe werden ausgeführt, um die zu beeinflussen [child] Tisch sowohl für eifrige als auch für faule Sammler.”

(http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#Foreign-Collection)

In der Dokumentation der Klasse selbst steht auch, dass das Hinzufügen / Entfernen an die Datenbank weitergeleitet wird. (http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/dao/ForeignCollection.html#add(T))

Ich habe jedoch noch nie damit gearbeitet, also hoffe ich nur, dass die Dokumentation korrekt ist und dies Ihnen bei der Lösung Ihres Problems hilft. 🙂

1143560cookie-checkSpeichern von untergeordneten Sammlungen mit OrmLite auf Android mit Objekten, die von Jackson erstellt wurden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy