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

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

使用硬编码的偏移量可能会出现问题,这会使代码更难阅读,因而难以维护。

例如,两个桌子商店和过道按照

商店表有列


_ID
店铺名称


过道有列


_ID
过道商店链接
过道名称


然后,您可能想要获取一个包含过道和关联商店的光标(aisleshoplink持有过道所在的各个商店的_id)。

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

将导致光标具有列


_id(通道的_id偏移量= 0)
aisleshoplink(值将是相应商店的_id,偏移量= 1)
过道名称(偏移量= 2)
_id(商店的_id,应与过道购物链接匹配,偏移量= 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,而不必诉诸使用偏移量呢?

最佳答案

简而言之,利用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
过道ID
过道商店链接
过道名称
shop_id
店铺名称

08-18 14:42