2017-06-24 5 views
6

Grundsätzlich gibt es zwei Dinge, die ich nicht verstehe: Objekte mit Objekten und Objekte mit Listen von ObjektenWie Objekte in Android Room gespeichert werden?

Angenommen, ich erhalte eine Liste von Objekten vom Server. Jeder von ihnen sieht wie folgt aus:

@Entity 
public class BigObject { 
    @PrimaryKey 
    private int id; 
    private User user; 
    private List<SmallObject> smallObjects; 
} 

mit diesen beiden Objekten als Felder:

@Entity 
public class User { 
    @PrimaryKey 
    private int id; 
    private String name; 
    @TypeConverters(GenderConverter.class) 
    public MyEnums.Gender gender; 
} 

@Entity 
public class SmallObject { 
    @PrimaryKey (autoGenerate = true) 
    private int id; 
    private String smallValue; 
} 

Sie sind komplizierter als diese, so kann ich nicht verwenden @TypeConverters als Zimmer schlägt vor:

error: Cannot figure out how to save this field into database. You can consider adding a type converter for it. 

Wie speichere ich diese Datenstruktur im Raum?

+1

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

Antwort

15

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

+0

Eingebettete Dokumente: https://developer.android.com/reference/android/arch/persistence/room/Embedded.html – DeaMon1

Verwandte Themen