2017-09-11 27 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