2013-06-21 5 views
19

から作成されたオブジェクトとAndroid上でOrmLiteと子のコレクションを保存する私は、オブジェクトの素敵なネストされたコレクションになってbyte[]としてJSONオブジェクトに引っ張る私は私のアプリから呼び出すよRESTサービスを、持っています - - そのビットはすべて正常に動作します。私がしたいのは、OrmLiteを使ってこれらのオブジェクトをSQLiteストレージに永続化することです。それは、OrmLiteがネストされたオブジェクトを自動的に永続化しないため、分かりにくいものです。はジャクソン

を簡単にするために、のは、私の実際の機能を取り除く聞かせて、私のオブジェクトは、単に以下のようにモデル化することがしてみましょう:

@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"私のPOJOを手動で作成するには問題ありません。

しかし、私はまだオブジェクトが(この場合はジャクソンに)別のライブラリによって生成されている場合には要因の答えを見ていませんでした。ジャクソンのデシリアライゼーションの内臓を深く掘り下げることなく(そのシンプルさの利点をすべて取り除く)ジャクソンに子オブジェクトを作成させてから親に追加しようとすることなく(何かが不足していない限り、この特定のケースでは特に魅力的な解決策ではないようです。

同様に、単一の子オブジェクトを処理するのに適していると思われる注釈を外部キーに追加する他の解決策がありますが、これらの注釈は@ForeignCollectionFieldと対応するCollectionで作業しているときは利用できません。

+0

?親オブジェクトを作成するたびに常にすべての子オブジェクトを作成しようとするのは残酷なようです。 – Gray

+0

'@ForeCollectionField'アノテーションに渡すことができるパラメータがあって、その子オブジェクトを永続化するように指定するとよいでしょう。 "親の前に子供を作成する"ソリューションは、ジャクソンのようにトップダウンオブジェクトの作成にはうまくいきません(私に行方不明の別の方法がない限り) –

+0

良いアプローチは、Stringでjacksonとシリアル化することですjsonとしてフィールドにリンクされ、完全なオブジェクトが格納されます。または、ネストされたオブジェクトに対してクエリーを実行する場合は、キーと別のオブジェクトを保存します。あなたがその答えにもっと情報を求めたいのなら、教えてください。私は答えをします。 – jeorfevre

答えて

0

あなたの親クラスでコレクションの代わりにForeignCollectionを使用しようとする場合があります。 ORMLite-ドキュメントから

「外国のコレクションは、(追加の支持体)とコレクションが熱望している場合、オブジェクトは、両方の追加または内部リストから削除される場合には()メソッドを削除し、そしてDAOの呼び出しは、熱心なコレクションと怠惰なコレクションの両方に対して、[子]テーブルにも影響するようになります。

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)

でも、私は、これで働いたことがありませんので、私はちょうどドキュメントが正しく、これはあなたの問題を解決するのに役立ちます願っています。あなたはそれがうまく_should_どのように考えるか興味があるだけ:-)

関連する問題