2017-06-24 101 views
6

基本上,有兩件事我不明白:物體和物體與對象列表如何在Android室中存儲對象?

說我收到來自服務器的對象列表。他們每個人都看起來是這樣的:

@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'並用'userId'替換'user'作爲外鍵。 'User'和'SmallObject'將外鍵返回到'BigObject'。然後,建立一個視圖模型,或者你從'@ Query' DAO方法填充的東西,這些DAO方法檢索'BigObject',相關的'User'及其相關的'SmallObjects'。 – CommonsWare

回答

15

我認爲最好的方式來回答這是存儲結構一個breif概述...

列表

房不支持存儲嵌套一個POJO的內部的名單。推薦的存儲列表方式是使用外鍵方法。將對象列表存儲在一個單獨的表中(在本例中爲一個smallObjects表),並將外鍵用於其相關的父對象(本例中爲「big_object_id」)。它應該是這個樣子......

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

請注意,我們已經加入了@Ignore annotaiton到List<SmallObject>因爲我們想忽略房間持久性在外地(如列表不支持)。它現在存在,所以當我們從DB中請求我們的相關小對象列表時,我們仍然可以將它們存儲在POJO中。

據我所知,這意味着你正在做兩個查詢。

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

看來,有很短的手這個在@Relation

類型轉換器

這些都是,你必須能夠不被flattend一個複雜的數據結構情況下,劑型丟失信息,並存儲在一個列中。 Date對象就是一個很好的例子。 Date對象很複雜並且保存了很多值,所以將它存儲在數據庫中是非常棘手的。我們使用類型轉換器來提取日期對象的毫表示並存儲它。然後,我們將millis轉換爲日期對象,從而保持我們的數據不變。

嵌入式

這是當你想利用所有嵌套的POJO的領域在父POJO和扁平出來的一個表來存儲使用。一個例子:

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

..when嵌入該結構將被存儲在數據庫中作爲:

- name 
- age 
- location_x 
- location_y 
- DOB 

在嵌入式某種意義上存在以節省時間創建類型轉換器,它包含初級每嵌套對象類型字段如String,int,float等...

+0

嵌入式文檔:https://developer.android.com/reference/android/arch/persistence/room/Embedded.html – DeaMon1