2016-03-10 47 views
0

我在android中有两个表。我创建了所有的CRUD操作。但是我很难建立它们之间的关系。
所以我有表Recepit将有许多日志(从表日志)。
如果我创建Recepit1并且它有例如13个日志,那么我将在列表视图中显示Recepit1,并在项目上点击它必须向我显示这13个日志。
以下是我为Logs和Recepit创建的方法。如何设置Android数据库关系,如“has_many和belongs_to”

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日志?

+0

您有MySQL数据库运行在Android上? –

+0

不,这是sqlite – RubyDigger19

回答

0

您可以创建另一张表来维护多对多的关系:)这就是您如何在RDBMS中维护我们的许多或多对多关系船。

正如你所说的有两个表1.日志和2.Reciepts和它们都有主键:)

现在创建一个名为例如表:LOGS_BELONGS_TO_RECIEPT。 此表将有两列。 col1:LogsID和col2:ReciptID。两者分别是日志表和Recipt表的外键参考:)

我的意思是col1:LogsID引用日志表主键。 COL2:ReciptID引用收据表的主键

所以,当你进入一个新的日志为特定的收据,你将在这里的条目:)

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

没有必要有此表:)

编辑任何主键

额外点:) 如果你想获取你CCAN recipt ascociated的所有日志写入查询像

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

编码愉快的好友:)

+0

thunk克里克_007:正在努力格式化:) –

+0

然后我应该有这样的事情: '公共静态最终字符串KEY_ID =“ID”; //我的日志ID' 'public static final String RECEPIT_ID =“id”; // recepit id' 'public static final String LBTR_ID =“id”; //新表id' '字符串CREATE_LOGS_BELONGS_TO_RECEPIT_TABLE = “CREATE TABLE” + TABLE_LOGS_BELONGS_TO_RECEPIT + “(” + LBTR_ID + “INTEGER PRIMARY KEY AUTOINCREMENT,” + RECEPIT_ID + “INTEGER,” + KEY_ID + “INTEGER);”;' – RubyDigger19

+0

没有朋友:) CREATE_LOGS_BELONGS_TO_RECEPIT_TABLE将有两列,如你所说:)但他们不会是主键:)他们将foreighn键:)没有必要有这个表的主键它自我:) –

2

我不知道是否有在Java中特殊的东西,你这样做,但是,纯粹是在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一个引用表中personidPRIMARY 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; 


如果你有一个NN关系:

在您的例子这意味着一个logs可以属于很多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) 
); 

希望它能帮助:)

+0

我相信你的回答更准确,然后我的:)因为你完全准确地指出需要在表中有一个外键。虽然解决问题的办法解决问题对于维持mn(多对多)关系而不是1-n(一对多)更准确但我建议解决方案,因为我叮嘱他改变他现有的任何一个表架构:)所以upvoting你的答案:) –

相关问题