2

私は、他の複雑なデータ型の 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 を含むオブジェクトを操作できるようにする、私が見逃したパターンはありますか?

4

1 に答える 1

4

コードは ArrayLists で問題なく動作しています。私は自分のフィールドを次のように宣言しました:

@ForeignCollectionField(eager = true, maxEagerForeignCollectionLevel = 99)
private Collection<PersonalNameStructure> personalnamestructures = new ArrayList<>();

そしてゲッター

public List<PersonalNameStructure> getPersonalNameStructures() {
    return new ArrayList<>(personalnamestructures) ;
}

そのため、ArrayList を維持しようとするのではなく、オンザフライで作成します。

明らかに、すでにこれに気付いているかもしれませんが、eager 設定は外部コレクションの読み取りに影響し、外部フィールドやレコードの書き込み時には何もしないため、オブジェクトの書き込みにも注意する必要があります。

于 2013-03-10T19:38:13.900 に答える