如何设置 android 数据库关系,如 "has_many and belongs_to"

How to set up android database relation like "has_many and belongs_to"

我在 android 中有两个 table。我创建了所有 CRUD 操作。但是我很难在它们之间建立关系。
所以我有 table Recepit,其中会有很多日志(来自 table 日志)。
如果我创建 Recepit1 并且它有例如 13 个日志,那么我将在列表视图中显示 Recepit1 并且在项目单击时它必须向我显示这 13 个日志。
下面是我创建日志和 Recepit 的方法。

String CREATE_LOGS_TABLE = "CREATE TABLE " + TABLE_LOGS + " (" +
                KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                KEY_CREATED_AT + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP,"+
                KEY_PLATENUMBER + " TEXT, " +
                KEY_SORT + " TEXT, "+
                KEY_GRADE+ " TEXT, "+
                KEY_DIAMETER + " INTEGER, " +
                KEY_LENGTH + " INTEGER);";
String CREATE_RECEPITES_TABLE = "CREATE TABLE " + TABLE_RECEPIT + " (" +
                RECEPIT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                RECEPIT_PLACE + " TEXT, " + RECEPIT_SHIPPING + " TEXT, " +
                RECEPIT_WAREHOUSE + " TEXT, " + RECEPIT_CARRIER + " TEXT, " +
                RECEPIT_LICENCE + " TEXT, " + RECEPIT_DRIVER + " TEXT, " +
                RECEPIT_CUSTOMER + " TEXT, " + RECEPIT_DEST_WAREHOUSE + " TEXT, " +
                RECEPIT_EMPLOYEE + " TEXT, " +
                RECEPIT_CREATED_AT + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";

问题:
如何设置 table Recepit has_many 记录的关系?

您可以创建另一个 table 来维护多对多关系 :) 这就是您在 RDBMS 中维护我们的多对多关系的方式。

正如你所说,有两个 table 1. Logs 和 2.Reciepts 并且它们都有主键 :)

现在创建一个 table,例如:LOGS_BELONGS_TO_RECIEPT。 table 将有两列。 col1:LogsID 和 col2:ReciptID。两者分别是 Logs table 和 Recipt table 的外键引用 :)

我的意思是 col1:LogsID 引用日志 table 主键。 col2:ReciptID 引用 Reciept table 主键

因此,每当您为特定收据输入新日志时,您都会在此处输入:)

喜欢LOGS_BELONGS_TO_RECIEPT

RecieptID      LogsID
1              L1
1              L2
1              L3
2              L4
2              L5

因此您可以从收据 table 查询所有收据并将其显示在其列表视图中,当用户点击列表时从 LOGS_BELONGS_TO_RECIEPT 获取与其关联的所有日志 ID 然后查询所有这些日志来自您的日志 table 并显示 :)

干净简单但有效 :) 不是吗:)

编辑: 好的,这是一个您可以尝试的查询:)编辑了您粘贴在评论中的自己的查询。

public static final String KEY_ID = "id"; //my logs id 
public static final String RECEPIT_ID = "id"; //recepit id    

CREATE_LOGS_BELONGS_TO_RECEPIT_TABLE = "CREATE TABLE " + TABLE_LOGS_BELONGS_TO_RECEPIT + " (" + RECEPIT_ID + " INTEGER, " + KEY_ID + " INTEGER, FOREIGN KEY("+ RECEPIT_ID +") REFERENCES "+ TABLE_RECEPIT +"("+ RECEPIT_ID +"), FOREIGN KEY("+ KEY_ID +") REFERENCES "+ TABLE_LOGS +"("+ KEY_ID +"));"

这个 table 不需要任何主键 :)

编辑

加分:) 如果你想获取所有与 recipt 相关的日志,你可以写查询

Select * from TABLE_LOGS where KEY_ID IN (select KEY_ID from LOGS_BELONGS_TO_RECEPIT_TABLE  where RECEPIT_ID = 'whatever user tapped');

快乐的编码伙伴:)

我不确定你在 java 中是否有什么特殊之处可以这样做,但是,纯粹在 mysql 中,你可以这样做:

如果两个 table 之间存在 1-n 关系:

您基本上需要在两个 table 之一中添加一个 foreign key。这个外键是一个将 "point" 到另一个 table.
的列 始终使用 N 行的 table 指向 1 行的 table 并且最好使用唯一字段来创建外键。
Mysql有一个很好的例子

CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
    PRIMARY KEY (id)
);

您可以看到,在 table shirt 中,列 owner 是对 table [=17= 中的 id 的引用] 并且 idPRIMARY KEY 因此独一无二。

在您的示例中,TABLE_LOGS 应该指向 TABLE_RECEPIT。 然后你可以使用一个简单的连接来知道哪些日志属于哪个 recepit。

SELECT table_logs.*, table_recepit.id as belongs_to 
FROM table_logs LEFT JOIN table_recepit 
  ON (table_logs.recepit_id = table_recepit.id);

要获得有多少日志有一个recepit,你可以使用GROUP BY

SELECT table_recepit.*, COUNT(table_logs.id) as number_of_logs 
FROM table_recepit LEFT JOIN table_logs 
  ON (table_recepit.id =  table_logs.recepit_id) 
GROUP BY table_recepit.id;


如果你有 n-n 关系:

在您的示例中,这意味着一个 logs 可以属于多个 recepit 并且一个收据可以有多个日志。 在这种情况下,您必须创建一个关系 table 来记录您的 table 关系。
此 table 将如下所示:

CREATE TABLE recepit_to_logs (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    recepit_id INT UNSIGNED NOT NULL REFERENCES table_recepit(id),
    logs_id INT UNSIGNED NOT NULL  REFERENCES table_logs(id),
    PRIMARY KEY (id)
);

希望对您有所帮助:)