使用典型的 _id 列并在创建游标时连接表并选择所有列,将导致游标包含多个 _id 列。
要访问特定的 _id 列,需要使用实际偏移量,而不是列名称。
使用硬编码偏移量可能会出现问题,它会使代码更难阅读,从而更难维护。
例如,两张 table 商店和过道
商店表有列
- _id
- 店铺名称
过道有柱子
- _id
- aisleshoplink
- channel 名称
然后您可能想要获取一个包含过道和关联商店的光标(aisleshoplink 包含该过道所在的相应商店的 _id)。
使用SELECT * FROM aisles LEFT JOIN Shops ON aisleshoplink = Shops._id
将导致光标具有列
- _id(过道的 _id 偏移量=0)
- aisleshoplink(值将是相应商店的 _id,偏移量 = 1)
- channel 名称(偏移量=2)
- _id(商店的 _id,应与 aisleshoplink 匹配,偏移量 = 3)
- 商店名称(偏移量=4)
除了偏移量之外,生成的游标没有任何东西可以区分 _id 列。您不能像在 SQL 中那样使用表名作为前缀。
即 cursor.getLong(_id)
不明确(从有限的测试看来,返回最后一个 _id)。
cursor.getLong("aisles._id")
失败,并发出 E/SQLiteCursor: requesting column name with table name -- aisles._id
(结果也是不一致,有时只显示 1 个失败,有时会显示所有失败)。
那么应该如何从光标中检索适当的_id,而不必求助于使用偏移量?
最佳答案
简而言之,利用 AS 为重复的列名称指定特定的列名称。
例如代替
SELECT * FROM Aisles LEFT JOIN Shops ON aisleshoplink = Shops._id
你可以使用
SELECT aisles._id AS aisles_id、aisleshoplink、aislename、shops._id AS shop_id、shopname FROM aisles LEFT JOIN 商店 ON aisleshoplink = 商店._id
但是,您将不会获得可能需要的 _id 列(例如对于 CursorAdapter)。列列表也可能相当广泛,并且是您最想要的。所以你可以使用
SELECT *, aisles._id AS aisles_id, Shops._id AS Shops_id FROM 过道 LEFT JOIN 商店 ON aisleshoplink = 商店._id
这有一个缺点,即再次有两个 _id 列,因此使用返回的 id,例如在 OnItemClick
监听器可能不符合预期。
因此,也许应该使用第一个,并特别提供所有列,包括特别包含适当的 _id :-
SELECT aisle._id、aisles._id AS aisles_id、aisleshoplink、aislename、shops._id AS shop_id、店铺名 FROM aisles LEFT JOIN 店铺 ON aisleshoplink = 店铺._id
通过 SQLite query
方法使用上述内容可以是:-
String query_tables = "aisles LEFT JOIN shops ON aisleshoplink = shops._id";
String[] columns = {
"aisle._id".
"aisles._id AS aisles_id",
"aisleshoplink",
"aislename",
"shops._id AS shop_id",
"shopname"
};
Cursor mycursor = db.query(query_tables,
columns,null,null,null,null,null
);
生成的光标将包含列:-
- _id
- aisles_id
- 过道商店链接
- channel 名称
- shops_id
- 店铺名称
关于android - 当连接中有多个 _id 列时,如何访问各个 _id 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46165869/