2012-10-02 75 views
27

如果我對我的解釋不太清楚,我表示歉意,但如果要求,我會添加並編輯此問題以求清晰。將ForeignCollection轉換爲ArrayList - ORMLite,Gson和Android

我正在開發一個Android應用程序,它通過外部API接收數據並使用ORMLite在本地存儲數據。之前本地存儲的數據和使用ORMLite我有其檢索JSON從服務器模型和通過解析它:

Gson gson = new Gson(); 

String result = ApiClient.httpPost("/user_route"); 

User user = gson.fromJson(result, User.class); 

用戶類被定義

public class User { 
    int id; 
    String name; 
    ArrayList<Image> media; 
} 

和圖像類:

public class Image { 
    int id; 
    int creator_id; 
    String url; 
} 

這是模型和方法的簡化表示,但我相信我保留了所有相關信息。 BTW,media是一個包含Images的JSON對象。

現在我試圖在本地存儲數據。爲了使用ORMLite建立用戶和圖像之間的關係,似乎你必須使用ForeignCollection類和@ForeignCollectionField註解。我不相信Gson可以直接解析Json的User類中的media字段作爲ForeignCollection對象,所以我認爲我需要創建兩個字段mediaCollectionmedia

現在使用ORMLite User類看起來是這樣的:

@DatabaseTable(tableName = "Users") 
public class User { 
    @DatabaseField(generatedId = true) 
    int id; 

    @DatabaseField 
    String name; 

    @ForeignCollectionField 
    ForeignCollection<Image> mediaCollection; 

    ArrayList<Image> media; 
} 

與ORMLite Image類看起來是這樣的:

@DatabaseTable(tableName = "Images") 
public class Image { 

    @DatabaseField(generatedId = true) 
    int id; 

    @DatabaseField(foreign=true, foreignAutoCreate=true, foreignAutoRefresh=true) 
    private User user; 

    @DatabaseField 
    int creator_id; 

    @DatabaseField 
    String url; 

} 

應用的流量如何工作是第一次我打的地方數據庫爲用戶。我執行一些邏輯,然後確定是否需要實際點擊服務器以「更新」或「刷新」用戶數據。

無論數據來自本地還是來自遠程服務器,我都需要在同一視圖中顯示Image。現在,根據數據是本地還是遠程,Image的URL存儲在不同類型的對象中。我想要做的是,如果Image存儲在ForeginCollection對象中,請將該對象轉換爲ArrayList,然後繼續執行我的代碼的其餘部分,該代碼將提取Image URL並將其顯示。

我想有兩個問題。

  1. 這是一個很好的計劃,或者我應該寫兩個完全獨立的從數據中提取Image URL,從ForeignCollection對象並未轉換爲ArrayList的方法呢?

  2. 如果一個很好的計劃,我怎麼轉換ForeginCollectionArrayList

+0

在另一個相關的線程中查看答案:http://stackoverflow.com/a/31598771/3495371 –

回答

20

這是一個很好的計劃,還是我應該寫兩種完全不同的方式從數據中提取圖像URL,而不是將對象從ForeignCollection轉換爲ArrayList?

它應該工作。否則,我看不到一種簡單的方法。

幾點:

  • 是否有某種方式慶祝ForeignCollection爲瞬態所以它在傳輸時JSON忽略?然後,您可以爲JSON和ORMLite使用相同的User對象。
  • 某種hydrate()方法會很好,所以它會從media - >mediaCollection轉換,反之亦然。
  • 如果您需要將JSON傳輸的圖像加載到外部收藏中,那麼您應該使用Dao.getEmptyForeignCollect(...)方法。收集完成後,您可以添加圖像並將其添加到表格中。

如果這是一個很好的計劃,我該如何將ForeignCollection轉換爲ArrayList?

這很容易。 A ForeignCollectionCollection。你可以做一個:

media = new ArrayList<Image>(mediaCollection); 

所以你User.getMedia()方法應該檢查null如果是這樣,從mediaCollection字段轉換。

+0

你可以擴展從'ForeignCollection' ?我嘗試使用'Image [] media = mediaCollection.toArray(new Image [0])獲取數組,但是這會拋出java.lang.IllegalStateException:嘗試重新打開已關閉的對象:SQLiteDatabase [ ...]來自'LazyForeignCollection:232'。 –

0

不能創造出比第一存儲在數據庫中的對象以外的ForeignCollection,然後讓ormlite在ForeignCollection檢索。您可以使用Collection而不是ForeignCollection,但它的工作方式相同。我做的是以下幾點:我在父類中有兩個集合。一個是json或xml被反序列化的ArrayList。當父對象被存儲時,dao將Arraylist中的對象存儲到鏈接到其他Collection(ForeignCollection)的表中的數據庫中。當檢索父對象時,它會自動包含ForeignCollection中的對象。這不是完美的,但它的工作原理。

+2

這有點不正確。你可以使用'Dao.getEmptyForeignCollection(...)'方法獲得一個新的'ForeignCollection'。看到這裏:http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/dao/Dao.html#getEmptyForeignCollection(java.lang.String%29 – Gray

2

剛剛從@ForeignCollectionFieldArrayList<Object> 轉換,你可以這樣做:

ArrayList<Object> taskFieldsList = new ArrayList<Object>(your collection); 

希望它幫助你。