2017-09-11 28 views
1

使用典型的列和连接表并在创建游标时选择所有列将导致包含多个_id列的游标。当有多个来自联接的_id列时,如何访问各个_id列?

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

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

例如两个表商店过道按照

表商店具有列

  • _id
  • SHOPNAME

过道中的列

  • _id
  • aisleshoplink
  • aislename

那么你可能想获取包含过道和相关店铺的光标(aisleshoplink持有_id)。使用SELECT * FROM aisles LEFT JOIN shops ON aisleshoplink = shops._id

将导致具有列

  • 光标

    _id(过道的_id偏移= 0)

  • aisleshoplink(值将是各店铺的_id,偏移= 1)
  • aislename(offset = 2)
  • _id(店铺的_id,应该匹配aisleshoplink,偏移= 3)
  • SHOPNAME(偏移量= 4)

所得光标无关区分比另一个_id列抵消。你不能像在SQL中那样用表名前缀它。

cursor.getLong(_id)是不明确的(从有限的测试中出现返回最后一个_id)。

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

那么我们应该如何适当_id从游标检索出来,而不必诉诸使用偏移?

回答

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
  • shops_id
  • SHOPNAME