我正在使用 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)
);
我有两个问题。
1. 如何有效地将 CheckIn 及其相关对象插入到数据库中?
更具体地说,如果我在 Java 中有一个 CheckIn 对象,但尚未提交到数据库,我如何构造一个 INSERT 语句,将 CheckIn 插入到 CheckIn 表中,同时存储新的 CheckIn 与一个或多个收件人的关系? 似乎要存储与收件人的关系,我需要已经知道尚未设置的 checkIn._id,因为尚未将 CheckIn 输入数据库。
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 对象的最佳方法感到困惑。如果我正在尝试编写一个这样的方法public Set<CheckIn> getAllCheckIns(),它将返回一组存储在数据库中的所有 CheckIn,我是否需要运行上面的查询,然后使用相同的 checkIn._id 遍历每一行,并在该循环中,每一行都有相同的接收者._id,等等?有没有更好的方法来做到这一点?
我很抱歉这个冗长的问题。从今天早上开始,我只在单表数据库之外使用 SQL,我不想遗漏任何重要信息。如果我错过了什么,请告诉我。