3

開発中のアプリケーションで使用しているオブジェクトを再構築するために使用できるデータを格納するために、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 だけを扱ってきましたが、重要な情報を省略したくありませんでした。何か見逃した場合はお知らせください。

4

1 に答える 1

3

質問 1 の答え: 2 つの方法があります。

a. 挿入された行の ID を見つけ、それを使用して 2 番目のテーブルに挿入します。ここに記載されているように Android Insert メソッドを使用している場合は、挿入された行の ID を見つけることができます: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insert%28java.lang.String, %20java.lang.String,%20android.content.ContentValues%29

ここでは、すべての DB テーブルがコミットされているか、またはまったくコミットされていないことを確認する必要があります。

b. トリガーを作成できます。トリガーは、指定されたデータベース イベントが発生したときに自動的に実行されるデータベース操作です。トリガーの作成方法については、http ://www.sqlite.org/lang_createtrigger.html をご覧ください。

たとえば、テーブルのチェックインに行が挿入されたときに起動される AFTER INSERT トリガーを作成できます。次に、そのトリガーで行を別のテーブルに挿入できます。トリガーが起動されると、新しく挿入された行にアクセスできます。

質問 2 への回答: 私は通常、次のことを行います。

  • 表 1 から選択 - チェックイン表
  • カーソルを繰り返し処理し、チェックイン オブジェクトを準備します。
  • ループ内で、テーブル 2 - 受信者テーブルから選択します。
  • 受信者テーブルを反復処理し、チェックイン オブジェクトを準備します。

これには、あまりにも多くの DB 選択が含まれます。

または、すべてのデータを 1 回選択してから、反復してオブジェクトを準備することもできます。

私が言おうとしている点は、反復する必要があるということです:D

于 2013-01-08T05:12:10.950 に答える