我正在使用SQLite数据库来存储可用于重建我正在开发的应用程序中使用的某些对象的数据。我正在存储CheckIns,Recipients和ContactMethods。在Android中使用一对多和多对多关系的INSERT和SELECT语句
public class CheckIn {
private int id;
private boolean isEnabled;
private Date startTime;
private Repetition repetition;
private Set recipients;
}
public class Recipient {
private String name;
private Set contactMethods;
}
public class ContactMethod {
private String type;
private String address;
}
数据库架构我已经想出了这些对象的定义:
CheckIn Recipient
Recipient ContactMethod
在Java中,如下这些对象的字段的定义:
这些对象的关系如下如下:
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 getAllCheckIns()这样的方法,它将返回存储在数据库中的所有CheckIns的集合,那么是否需要运行上面的查询,然后使用相同的checkIn._id循环每行,并在该循环内,每一行都有相同的recipient._id,等等?有没有更好的方法来做到这一点?
对于长期的问题,我很抱歉。自今天上午以来,我只使用超过单表数据库的SQL,而且我不想忽略任何重要信息。让我知道如果我错过了什么。
2013-01-08
Genre