如何设置 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
的引用] 并且 id
是 PRIMARY 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)
);
希望对您有所帮助:)
我在 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
的引用] 并且 id
是 PRIMARY 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)
);
希望对您有所帮助:)