如何设置像“has_many和belongs_to”这样的android数据库关系

时间:2016-03-10 08:26:38

标签: android android-sqlite

我在android中有两个表。我创建了所有CRUD操作。但我很难建立他们之间的关系。
所以我有表Recepit,它会有很多日志(来自表Logs)。
如果我创建了Recepit1并且它有例如13个日志,那么我将在列表视图中显示Recepit1,在项目点击时它必须显示这13个日志。
以下是我的Logs and 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);";

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

2 个答案:

答案 0 :(得分:2)

我不确定你是否有特殊的东西可以这样做,但是,纯粹在mysql中你可以这样做:

如果两个表之间有1-n关系:

您基本上需要在两个表之一中添加foreign key。这个外键是一个将指向"指向"到另一张桌子 始终使用带有N行的表格指向具有1行的表格,并且最好使用唯一字段来创建外键 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)
);

您可以在表shirt中看到,列owner是对id表中person的引用,而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);

要获取有多个日志有一个收件人,您可以使用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,并且一个recepit可以包含许多日志。 在这种情况下,您必须创建一个关系表,以便记录您表格的关系。
此表格如下所示:

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

希望有所帮助:)

答案 1 :(得分:0)

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

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

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

我的意思是col1:LogsID引用Logs表主键。        col2:ReciptID引用Reciept表主键

因此,每当您输入特定收据的新日志时,您将在此处输入一个条目:)

喜欢LOGS_BELONGS_TO_RECIEPT

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

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

清洁简单但有效:)不是吗:))

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

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

此表无需任何主键:)

修改

额外点:) 如果要获取与recipt相关的所有日志,则可以编写类似

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

快乐的编码伙伴:)