現在作成中の小さなアプリで 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 を生成しようとすると、
私の状況が非常にまれであるとは思いません。これまでに誰もこれに遭遇したことはありません。解決策をいただければ幸いです。
よろしく、トドール