使用典型的 _id 列并在创建游标时连接表并选择所有列,将导致游标包含多个_id列。
要访问特定的 _id 列,则需要使用实际偏移量,而不是列名称。
使用硬编码偏移可能会有问题,它会使代码难以阅读并因此难以维护。
例如,根据
两个表商店和过道商店表格列
过道有列
然后你可能想要一个包含过道和相关商店的光标(aisleshoplink持有过道所在的相应商店的 _id )。
使用SELECT * FROM aisles LEFT JOIN shops ON aisleshoplink = shops._id
将导致Cursor具有列
生成的Cursor无法区分偏移以外的 _id 列。您不能像在SQL中那样为表名添加前缀。
即cursor.getLong(_id)
含糊不清(从有限的测试中显示以返回最后一个_id)。
cursor.getLong("aisles._id")
失败并发出E/SQLiteCursor: requesting column name with table name -- aisles._id
(结果也不一致,有时只显示1次失败,有时会显示所有失败)。
那么如何从光标中检索适当的_id,而不必使用偏移?
答案 0 :(得分:2)
简而言之,利用 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 shops ON aisleshoplink = shops._id
但是,您可能无法获得可能需要的 _id 列(例如,对于CursorAdapter)。列列表也可能非常广泛,您最需要。所以你可以使用
SELECT *, aisles._id AS aisles_id, shops._id AS shops_id FROM aisles LEFT JOIN shops ON aisleshoplink = shops._id
这样做的缺点是,还有两个 _id 列,因此使用 id 返回,例如 OnItemClick
听众可能没那么正常。
所以也许使用第一个,应该使用专门提供的所有列,包括具体包括适当的 _id : -
SELECT aisle._id, aisles._id AS aisles_id, aisleshoplink, aislename, shops._id AS shop_id, shopname FROM aisles LEFT JOIN shops ON aisleshoplink = shops._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
);
结果光标将包含列: -