Ich denke, der beste Weg, dies ist bei der Speicherung von Strukturen eine breif Übersicht zu beantworten ...
Listen
Raum nicht speichern von Listen unterstützt, die innerhalb eines POJO verschachtelt sind. Die empfohlene Methode zum Speichern von Listen ist die Verwendung des Fremdschlüsselansatzes. Speichern Sie die Liste der Objekte in einer separaten Tabelle (in diesem Fall eine SmallObjects-Tabelle) mit einem Fremdschlüssel für das zugehörige übergeordnete Objekt (in diesem Fall "big_object_id"). Es sollte in etwa so aussehen ...
@Entity
public class BigObject {
@PrimaryKey
private int id;
private User user;
@Ignore
private List<SmallObject> smallObjects;
}
@Entity(foreignKeys = {
@ForeignKey(
entity = BigObject.class,
parentColumns = "id",
childColumns = "big_object_fk"
)})
public class SmallObject {
@PrimaryKey (autoGenerate = true)
private int id;
private String smallValue;
@ColumnInfo(name = "big_object_fk")
private int bigObjectIdFk
}
Beachten Sie, dass wir die @Ignore
annotaiton zu List<SmallObject>
hinzugefügt haben, als wir das Feld während der Raum persistance ignorieren möchten (wie Listen werden nicht unterstützt). Es existiert nun so, dass wir, wenn wir unsere Liste von verwandten kleinen Objekten aus der DB anfordern, diese im POJO speichern können.
Nach meinem Wissen bedeutet dies, dass Sie zwei Abfragen machen.
BigObject b = db.BigObjectDao.findById(bOId);
List<SmallObject> s = db.smallObjectDao.findAllSOforBO(bOId);
b.setsmallObjects(s);
Es scheint, dass es eine kurze Hand ist für diese in Form von @Relation
Typ Konverter
Diese sind für die Fälle, in denen Sie eine komplexe Datenstruktur haben, die werden abgeflacht werden kann, ohne Verlieren von Informationen und in einer einzigen Spalte gespeichert. Ein gutes Beispiel dafür ist das Date-Objekt. Ein Date-Objekt ist komplex und enthält viele Werte. Daher ist es schwierig, es in der Datenbank zu speichern. Wir verwenden einen Typkonverter, um die Milliendarstellung eines Datumsobjekts zu extrahieren und diese zu speichern. Wir wandeln dann die millis auf dem Weg nach draußen in ein Datumsobjekt um, so dass unsere Daten intakt bleiben.
Embedded
Diese wird verwendet, wenn Sie die Felder aller verschachtelten POJOs in Ihren Eltern POJO und glättet sie heraus speichern in einer Tabelle zu nehmen. ein Beispiel:
- name
- age
- location
- x
- y
- DOB
..when diese Struktur eingebettet würde in der Datenbank gespeichert werden, wie:
- name
- age
- location_x
- location_y
- DOB
In einem gewissen Sinne besteht Embedded Ihnen Zeit Erstellen von Typ-Wandler für jedes verschachteltes Objekt zu speichern, die primären enthält Felder wie String, int, float usw. eingeben
Im Allgemeinen enthalten Entitäten keine anderen Entitäten in Room, weder einzeln noch als Listen. Sie könnten * Fremdschlüssel * für andere Entitäten besitzen. Und andere Strukturen, wie ein Ansichtsmodell, können alle Entitäten enthalten, die benötigt werden. BigObject muss also 'smallObjects' entfernen und' user' durch 'userId' als Fremdschlüssel ersetzen. 'User' und' SmallObject' würden Fremdschlüssel zurück zu 'BigObject' haben. Richten Sie dann ein Ansichtsmodell oder etwas ein, das Sie aus '@ Query'-DAO-Methoden auffüllen, die das' BigObject', den zugehörigen 'User' und die zugehörigen' SmallObjects' abrufen. – CommonsWare