2016-03-10 43 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你的答案:) –

相關問題