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)
);

我有两个问题。

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

4

1 回答 1

3

对问题 1 的回答:有 2 种可能的方法。

一种。您找到插入行的 ID 并使用它插入到第二个表中。如果您使用此处记录的 Android Insert 方法,则可以找到插入行的 ID:http: //developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insert%28java.lang.String, %20java.lang.String,%20android.content.ContentValues%29

在这里,您必须确保所有数据库表都已提交或没有。

湾。您可以创建触发器。触发器是发生指定数据库事件时自动执行的数据库操作。了解如何创建触发器:http ://www.sqlite.org/lang_createtrigger.html

因此,例如,您可以创建一个 AFTER INSERT 触发器,当在表中插入一行时将触发该触发器。然后在该触发器中,您可以将一行插入另一个表。触发触发器时,您可以访问新插入的行。

对问题 2 的回答:我通常会执行以下操作:

  • 从表 1 中选择 - 签入表
  • 遍历光标并准备 Check In 对象。
  • 在循环中,从表 2 中选择 - 收件人表
  • 遍历收件人表并准备 Check in 对象。

这将涉及太多的数据库选择。

或者,您可以选择所有数据一次,然后迭代以准备对象。

我想说的是你必须迭代:D

于 2013-01-08T05:12:10.950 回答