開発中のアプリケーションで使用しているオブジェクトを再構築するために使用できるデータを格納するために、SQLite データベースを使用しています。CheckIns、Recipients、および ContactMethods を保存しています。
これらのオブジェクトは次のように関連しています。
CheckIn <--many -- to -- many--> Recipient
Recipient <--one -- to -- many--> ContactMethod
Java では、これらのオブジェクトのフィールドは次のように定義されています。
public class CheckIn {
private int id;
private boolean isEnabled;
private Date startTime;
private Repetition repetition;
private Set<Recipient> recipients;
}
public class Recipient {
private String name;
private Set<ContactMethod> contactMethods;
}
public class ContactMethod {
private String type;
private String address;
}
これらのオブジェクトに対して私が思いついたデータベース スキーマは、次のように定義されています。
CREATE TABLE checkIn(
_id INTEGER PRIMARY KEY AUTOINCREMENT,
isEnabled INTEGER,
startTime INTEGER,
repetitionNum INTEGER,
repetitionUnits TEXT
);
CREATE TABLE recipient(
_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT
);
CREATE TABLE contactMethod(
_id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT,
address TEXT,
recipientID INTEGER,
FOREIGN KEY(recipientID) REFERENCES recipient(_id) ON DELETE CASCADE
);
CREATE TABLE checkIn_recipient(
checkInID INTEGER,
recipientID INTEGER,
FOREIGN KEY(checkInID) REFERENCES checkIn(_id),
FOREIGN KEY(recipientID) REFERENCES recipient(_id)
);
2 つの質問があります。
1. CheckIn を関連オブジェクトとともにデータベースに効率的に INSERT するにはどうすればよいですか?
より具体的には、Java に CheckIn オブジェクトがあり、まだデータベースにコミットされていない場合、CheckIn テーブルに CheckIn を挿入するだけでなく、新しい CheckIn の関係を 1 人以上の受信者に保存する INSERT ステートメントをどのように構築できますか? ? 受信者との関係を保存するようです。CheckIn がまだデータベースに入力されていないため、まだ設定されていない checkIn._id を知っている必要があります。
2. Android で、たとえばデータベース クエリから CheckIn オブジェクトを再構築する最良の方法は何ですか?
正しいデータを取得するために必要な SQL クエリを知っていると思います。
SELECT checkIn.*, recipient.name, contactMethod.type, contactMethod.address
FROM checkIn
JOIN checkIn_recipient
ON (checkIn._id = checkIn_recipient.checkInID)
JOIN recipient
ON (checkIn_recipient.recipientID = recipient._id)
JOIN contactMethod
ON (recipient._id = contactMethod.recipientID)
このクエリは、データベース内のすべての CheckIn と Recipient のオブジェクトを作成するために必要なすべての情報を含むデータ行を取得します。これらの行を反復処理する Cursor オブジェクトを取得する方法も知っています。ただし、単一の CheckIn に必要なデータが複数の行に表示されるため、個々の CheckIn オブジェクトを構築する最善の方法について混乱しています。データベースに保存されているすべての CheckIn のセットを返すようなメソッドを作成しようとしている場合public Set<CheckIn> getAllCheckIns()
、上記のクエリを実行してから、同じ checkIn._id を使用して各行をループし、そのループ内で、同じ受信者のすべての行._idなど? これを行うより良い方法はありますか?
長い質問で申し訳ありません。私は今朝から単一テーブル データベース以外の SQL だけを扱ってきましたが、重要な情報を省略したくありませんでした。何か見逃した場合はお知らせください。