我正在使用 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,我不想遗漏任何重要信息。如果我错过了什么,请告诉我。