2013-06-21 27 views
19

我有一個REST服務,我從我的應用程序調用,該應用程序將一個JSON對象作爲byte[],然後變成一個很好的嵌套對象集合 - - 所有這一點工作正常。然後我想要做的就是使用OrmLite將這些對象保存到SQLite存儲中,這就是事情開始崩潰的地方,因爲據我瞭解,OrmLite不會自動保留嵌套對象。使用Orviite在Android上使用從Jackson創建的對象保存子集合

爲了簡單起見,讓我們帶出我的實際功能,並讓我的對象被簡單地模擬如下:

@DatabaseTable(tableName = "parents") 
public class Parent { 

    @DatabaseField(id=true) 
    private String name; 

    @ForeignCollectionField 
    // have to use Collection here because needs to be compatible with Jackson 
    private Collection<Child> children; 

    /* Getters and setters go here */ 
} 

@DatabaseTable(tableName = "children") 
public class Child { 

    @DatabaseField(id=true) 
    private String name; 

    @DatabaseField(foreign=true) 
    private Parent parent; 

    /* Getters and setters go here */ 
} 

什麼情況是,將與我的對應parentDao對象數據庫中創建一個新的Parent對象時,孩子們沒有和父母一起堅持下去。

這是一個常見的問題,之前已經提出過,其他問題與SO非常相似,其中最着名的是「Saving nested foreign objects with ORMLite on Android」,其中Grey建議在父母之前創建子對象對於手動創建我的POJO工作良好。

但是,我還沒有看到一個答案,其中的對象是由另一個庫(在這種情況下是傑克遜)生成的情況下的一個因素。如果不深入研究傑克遜的反序列化內部結構(這會消除其簡單性的全部好處),並試圖讓傑克遜創建子對象,然後將它們添加到父對象中(除非我錯過了某些東西,這比聽起來容易?)在這種特殊情況下,這似乎不是特別有吸引力的解決方案。

同樣,還有一些涉及進一步增加註釋外鍵,這似乎與單個子對象的工作是合適的其他解決方案,但與@ForeignCollectionField s工作及其相應的Collection■當這些註釋都沒有。

+0

只是好奇你怎麼想_should_工作?每次創建一個父對象時總是試圖創建所有的子對象似乎有點矯枉過正。 – Gray

+0

如果有一個參數可以傳遞給'@ ForeignCollectionField'註釋,它將指定子對象應該被持久化,這會很好。 「在父母之前創建子女」解決方案不適用於像傑克遜那樣自上而下創建對象(除非有另一種方法來處理這個問題,我錯過了?) –

+0

一個好方法是用字符串中的傑克遜序列化字段(鏈接)爲json並存儲完整的對象。或者,如果您想對嵌套對象執行查詢,請存儲密鑰和單獨的對象。如果你想了解更多的信息,告訴我。然後我會做出回答。 – jeorfevre

回答

0

您可能想嘗試在父類中使用ForeignCollection而不是Collection。

從ORMLite-文檔:

「外國藏品支持add()和remove()在這種情況下,對象將被都添加或刪除內部列表,如果集合渴望方法,以及DAO調用將會影響[child]表以及渴望和懶惰的集合。「

http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#Foreign-Collection

類本身的文件也指出,添加/刪除被轉發到數據庫。 (http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/dao/ForeignCollection.html#add(T)

雖然我從來沒有使用過,所以我只是希望文檔是正確的,這有助於你解決你的問題。 :-)