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

标签 android sqlite android-sqlite

使用典型的 _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/

相关文章:

android - 不应用进度条可绘制的填充

java - Android:应用程序关闭后 DiskLruCache 未保存

android - 如何安排服务在android中运行

java - Android:存储在 SQLite 中时图像的字节数组为空

android - 如何使用 Loop 将数据插入 Sqlite 数据库?

java - 将范围内的值插入 sqlite 时显示错误

Android Gradle 为什么我们需要 "allprojects"?

android - 如何使用 2 个 for 循环从 ArrayList 获取值

sql - 如何将单个字段转换为SQLite日期以计算工作日?

android - 数据库修剪策略