gpt4 book ai didi

android - Android 中具有一对多和多对多关系的 INSERT 和 SELECT 语句

转载 作者:太空狗 更新时间:2023-10-29 12:49:17 29 4
gpt4 key购买 nike

我正在使用 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() 的方法这将返回一组存储在数据库中的所有 CheckIns,我是否需要运行上面的查询,然后循环遍历具有相同 checkIn._id 的每一行,并在该循环中,每一行具有相同的 recipient._id,等等?有没有更好的方法来做到这一点?

很抱歉问了这么长的问题。从今天早上开始,我只在单表数据库之外使用 SQL,我不想遗漏任何重要信息。如果我遗漏了什么,请告诉我。

最佳答案

问题 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 触发器,当在 checkin 表中插入一行时将触发该触发器。然后在该触发器中,您可以将一行插入到另一个表中。当触发触发器时,您可以访问新插入的行。

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

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

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

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

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

关于android - Android 中具有一对多和多对多关系的 INSERT 和 SELECT 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14207598/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com