当联接中有多个_id列时,如何访问各个_id列?

时间:2017-09-11 23:50:24

标签: android sqlite android-sqlite

使用典型的 _id 列并在创建游标时连接表并选择所有列,将导致游标包含多个_id列。

要访问特定的 _id 列,则需要使用实际偏移量,而不是列名称。

使用硬编码偏移可能会有问题,它会使代码难以阅读并因此难以维护。

例如,根据

两个表商店过道

商店表格列

  • _id
  • SHOPNAME

过道有列

  • _id
  • aisleshoplink
  • aislename

然后你可能想要一个包含过道和相关商店的光标(aisleshoplink持有过道所在的相应商店的 _id )。

使用SELECT * FROM aisles LEFT JOIN shops ON aisleshoplink = shops._id

将导致Cursor具有列

  • _id (过道&_99的_id偏移= 0)
  • aisleshoplink (价值将是相应的商店_id,offset = 1)
  • aislename (偏移= 2)
  • _id (商店的_id,应与aisleshoplink匹配,偏移= 3)
  • 商店名称(偏移= 4)

生成的Cursor无法区分偏移以外的 _id 列。您不能像在SQL中那样为表名添加前缀。

cursor.getLong(_id)含糊不清(从有限的测试中显示以返回最后一个_id)。

cursor.getLong("aisles._id")失败并发出E/SQLiteCursor: requesting column name with table name -- aisles._id(结果也不一致,有时只显示1次失败,有时会显示所有失败)。

那么如何从光标中检索适当的_id,而不必使用偏移?

1 个答案:

答案 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
);

结果光标将包含列: -

  • _id
  • aisles_id
  • aisleshoplink
  • aislename
  • 店铺_id
  • SHOPNAME