0

現在作成中の小さなアプリで Android と ORMLite を使用しています。このアプリは、インポート/エクスポート機能を機能させることを目指しており、そのために私は Simple XML フレームワークを使用しています。そして、ある程度まではすべてがうまく機能します。

オブジェクト A にはオブジェクト B を参照する外部キーが含まれており、オブジェクト B は外部キー自体を介してオブジェクト C を参照しています。データベースのエクスポートは素晴らしいです。インポートは、すべてのオブジェクトの ID が連続しており、1 から始まる限り機能するという小さな注意事項があります。ただし、データベースが断片化されている場合、つまり、データベースをエクスポートした後、あちこちでレコードを削除した場合、生成された XML 構造に「穴」があります。オブジェクトの例は次のとおりです。

@DatabaseTable("orders")
public class Order {
    @DatabaseField(generatedId = true)
    private int _id;
    @DatabaseField(columnName="date")
    private Date _date;
    @DatabaseField(columnName="cost")
    private double _cost;
    @DatabaseField(foreign = true, columnName="customer_id")
    private Customer _customer;
    // ... more fields, getters and setters
}

@DatabaseTable("customers")
public class Customer {
    @DatabaseField(generatedId = true);
    private int _id;
    @DatabaseField
    private String _name;
    // ... more fields, getters and setters
}

2 人の顧客 (ID 1 と 2) を持つデータベースがあり、それぞれが 1 から 5 までと 6 から 8 までの注文を保持しているとします。これをエクスポートしてから、クリーンなデータベースに再インポートするとうまくいきます。ただし、顧客1とその注文を削除してエクスポートすると、輸出業者はIDをそのまま書き込みます。

<customer id="2">...</customer>

<order id="6">...</order>
<order id="7">...</order>
<order id="8">...</order>
<order id="9">...</order>

など。データを新しいデータベースにインポートするときは、最初に顧客オブジェクトを保存します

custDao.create((Customer)x);

そして、それぞれの注文は

orderDao.create((Order)o);

問題は、create 関数が提供された ID (0 ではない) を無視し、新しく生成された顧客の ID が 1 (新しい空のデータベース内) であることです。注文も同じです。しかし、id=2 で顧客を参照しているため、それらの間のリンクは壊れています。

このやや長ったらしい説明の後で、ここに私の質問があります: ORMLite に、生成された Id フィールドに提供された値を取得し、それを上書きする代わりに実行するように指示する方法はありますか? 作成関数が同じ ID を持つテーブルに既に行を見つけた場合に例外が生成された場合、私は問題ありませんが、それ以外の場合はレコードの保存に進みます...私はこれに対する回避策を考えました:オブジェクトは Comparator インターフェイスを使用して ID でソートできる必要があります。インポートするオブジェクトで ArrayList をソートします。オブジェクトごとに - 想定される ID を int に読み取ります。 - dao.create を使用してデータベースに保存します。 - オブジェクトの新しい ID が想定される ID と異なる場合は、dao.updateId を介して変更します。 - リスト内の次のオブジェクトに移動します。 . しかし、それは面倒でエラーが発生しやすいようです: create メソッドが ID を生成しようとすると、

私の状況が非常にまれであるとは思いません。これまでに誰もこれに遭遇したことはありません。解決策をいただければ幸いです。

よろしく、トドール

4

1 に答える 1

2

ORMLiteは、生成された ID テーブルに ID が既に設定されているオブジェクトを挿入できる注釈のallowGeneratedIdInsert=trueオプションをサポートしています。@DatabaseFieldID フィールドの値が null またはデフォルト値 (0、...) の場合、データベースは ID を生成します。これは、すべてのデータベース タイプ (Derby など) でサポートされているわけではありません。この特定のトピックに関する別の議論があります。


ここで行うべき適切なことは、メモリ内にオブジェクト グラフを構築し、それらのオブジェクトをディスクに保存する前に適切な オブジェクトに関連付けることだと思います。Customers をメモリに読み込む場合は、オブジェクトを読み込み、それぞれに実際のオブジェクトを設定します。次に、データベースに各オブジェクトを作成すると、ORMLite はフィールドを生成されたものに変更し、それぞれに保存されたフィールドも変更します。CustomerOrderOrderCustomerCustomeridcustomer_idOrder

大量のデータがあり、一度にすべてをメモリに読み込むことができない場合 (またはその他の理由で)、いつでも を構築し、ID にマップされた XML から IDMap<Integer,Integer>を保存できます。Customerデータベース。次に、オブジェクトをロードするときOrderに、外部オブジェクトに新しい修正された ID を設定できます。

お役に立てれば。オブジェクトをどのように読み取っているのかについて、もう少し詳しく教えてください。オブジェクト グラフを作成する方法のより良い例を示すことができます。

于 2011-03-07T14:37:51.237 に答える