2017-06-24 6 views
6

基本的に私が理解できない2つのことがあります:オブジェクトを持つオブジェクトとオブジェクトのリストを持つオブジェクトAndroidルームにオブジェクトを保存する方法は?

サーバからオブジェクトのリストを受け取ったといいます。それらのそれぞれは、次のようになります。フィールドのように、これらの2つのオブジェクトを持つ

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

@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; 
} 

彼らはこれよりも複雑なので、ルームが示唆するように、私は@TypeConvertersを使用することはできません。

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

このデータ構造をルームに保存するにはどうすればよいですか?

+1

一般に、エンティティはRoom内の他のエンティティを個別にまたはリストとして保持しません。彼らは他のエンティティに*外部キー*を保持するかもしれません。また、ビューモデルのような他の構造は、必要なエンティティを保持できます。だから、 'BigObject'は' smallObjects'を取り除き、 'user'を' userId'に置き換える必要があります。 'User'と' SmallObject'は 'BigObject'に外来キーを返します。次に、 '@ Query' DAOメソッドから、' BigObject'、関連する 'User'、および関連する' SmallObjects 'を取得するビューモデルまたは何かを設定します。 – CommonsWare

答えて

15

私はこれに答えるための最良の方法は、構造...

ルームは、POJOの内部にネストされているリストを格納サポートしていません

リストを格納中breifの概要だと思います。リストを格納するための推奨される方法は、外部キー方式を使用することです。オブジェクトのリストを、関連する親オブジェクト(この場合は「big_object_id」)への外部キーを持つ別のテーブル(この場合はsmallObjectsテーブル)に格納します。我々は(リストがサポートされていないとして)ルーム永続性の間にフィールドを無視するように、それは...私たちはList<SmallObject>@Ignore annotaitonを追加した

@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 
} 

注意を次のようになります。関連する小さなオブジェクトのリストをDBから要求したときに、POJOに格納することができるようになりました。

私の知る限り、これは2つの質問をしていることを意味します。

BigObject b = db.BigObjectDao.findById(bOId); 
List<SmallObject> s = db.smallObjectDao.findAllSOforBO(bOId); 
b.setsmallObjects(s); 

短い手が、これらはなくてflattendすることができますが、複雑なデータ構造を持っている場合のためにある@Relation

型コンバータ

の形で、このためにそこにあることが表示されます情報を失い、単一の列に格納されます。これの良い例はDateオブジェクトです。 Dateオブジェクトは複雑で多くの値を保持しているため、データベースに格納するのは難しい作業です。型変換器を使用して、日付オブジェクトのミリ表現を抽出して格納します。その後、ミリ秒を日付オブジェクトに変換してデータをそのまま維持します。

はあなたの親POJO内のすべてのネストされたのPOJOのフィールドを取り、一つのテーブルに格納するためにそれらを平らにしたいときには使用されている

を内蔵します。例:..​​whenこの構造を埋め込み

- name 
- age 
- location 
    - x 
    - y 
- DOB 

としてデータベースに格納されるであろう:埋め込み意味で

- name 
- age 
- location_x 
- location_y 
- DOB 

あなた時間プライマリを含むすべてのネストされたオブジェクトの型コンバータを作成し保存するために存在しますString、int、floatなどの型フィールド

+0

埋め込みドキュメント:https://developer.android.com/reference/android/arch/persistence/room/Embedded.html – DeaMon1

関連する問題