私は、他の複雑なデータ型の ArrayLists を含む非常に複雑なデータ型を持つ Android Java プロジェクトを持っています。ORMLite (4.42) を使用してデータベースにデータを保存しようとしています。
ArrayLists と ForeignCollection 間の変換に大きな問題があります。これを行うことができた人はいますか?
データベースとの継続的な同期は必要ありません。代わりに、構造全体を保存する save メソッドと、メソッド全体を復元する read メソッドがあります。オブジェクトがデータベースから復元された後、受信側が orm lite の ForeignCollection ではなく ArrayList を予期するインターフェイスを介してオブジェクトが送信されます。
私のアプローチは次のとおりです。ArrayList ごとに、補完的な ForeignCollection があります。オブジェクトをデータベースに格納する前に、ArrayList の内容が ForeignCollection にコピーされ、読み戻されるとその逆になります。
データベースからデータ構造を読み取るとき、後で orm lite パッケージを知らないユーザーにオブジェクトが送信されるため、構造全体が確実に復元されるようにしたいので、eager = true を設定します。
私の複雑なデータ型は次のようになります。
@DatabaseTable(tableName = "accounts")
public class Account {
@DatabaseField(generatedId = true)
private int id;
@ForeignCollectionField (eager = true, maxEagerLevel = 2)
private ForeignCollection<Order> ordersFoC;
private ArrayList<Order> ordersArL;
問題
アカウントをデータベースに保存する前に、次のことを試みました。私の希望は、ArrayList 内のオブジェクトを ForeignCollection にコピーし、Account オブジェクトでデータベースを更新することでした。オブジェクト myAccount はデータベース内のオブジェクトと同じ ID を持っているため、そのオブジェクトの更新が必要です。
ordersFoC.addAll(orderArL);
myDao.createOrUpdate(myAccount);
運がない。addAll メソッドは注文をデータベースに直接書き込むため、「addAll」は既存のレコードを追加して更新しないため、すべての注文が重複することになります。
そこで、最初にデータベースからすべての注文を削除しようとしましたが、やはりうまくいきませんでした:
ordersFoC.clear(); // Also tried: ordersFoC.removeAll(ordersFoC);
ordersFoC.addAll(orderArL);
myDao.createOrUpdate(myAccount);
オブジェクトはデータベースから削除されません。groups.google.com (by Philip Fu)で、これは ormlite の「既知の」問題であり、熱心な ForeignCollection は removeAll() または clear() でうまく機能しないことを読みました。
ormlite フレームワークを使用して複雑な型の ArrayLists を含むオブジェクトを操作できるようにする、私が見逃したパターンはありますか?