2011-02-15 49 views
9

這是一個有趣的問題,我感到震驚的問題在互聯網上沒有被更多地詢問。 Android的CursorAdapter非常有用,一旦你啓動並運行ContentProvider並學習如何使用它,但由於需要將_id字段作爲其查詢的一部分(在沒有它的情況下拋出錯誤),它是有限的。原因如下:Android的SimpleCursorAdapter使用DISTINCT查詢

我的具體問題是我有兩個調整器:一個調整器應該包含來自數據庫的唯一「類別」名稱,另一個應該填充來自所選「類別」的所有數據庫條目(類別是列名稱,在這裏)。這似乎是許多程序可能使用的非常簡單的設置,不是?試圖實現第一個微調是我遇到問題的地方。

這裏,我想對於第一微調查詢:

SELECT DISTINCT category FROM table; 

進行此查詢,因爲_id列時,必須作爲查詢的一部分上的CursorAdapter拋出一個錯誤。將_id列添加到投影中自然會返回表的每一行,因爲您現在也要求不同的id,並且每個id都是不同的(根據定義)。很明顯,我寧願每個類別名稱只看到一個條目。

我已經實現了一種解決方法,它只是簡單地進行上面的查詢,然後將結果複製到ArrayAdapter中。我之所以寫這篇文章是爲了看看這個奇怪的小問題是否有更優雅的解決方案,並開始討論我可以做得更好。備用實施建議,例如使用不同類型的控制或適配器,非常受歡迎。

回答

6

這是我結束了與查詢:

SELECT _id, category FROM table_name GROUP BY category; 

我使用SQLiteDatabase對象上的rawQuery()函數來執行此操作。 「GROUP BY」是獲得正確結果的關鍵,所以感謝用戶Sagar指引我朝着正確的方向。

請考慮用戶Al Sutton對這個問題的回答,因爲它可能是對這個問題的更優雅的解決方案。

謝謝大家!

4

我建議有一個單獨的表,其中只有_id &類別,其中每個唯一類別包含一行。您的數據行然後可以使用類別表中的_id替換其類別字段。

這增加了您可以更改類別表中的類別的優勢,並且它將顯示在該類別的所有條目中。

+0

哦,這看起來像優秀的數據庫設計我!爲了讓我的內容提供者儘可能簡單,我被告知要儘量減少表的數量,否則我會按照你的建議去做。感謝您添加此! – SilithCrowe 2011-02-15 17:11:44

+0

您的內容提供者可以使用多表查詢來處理提供給它並從其返回的行中的類別名稱。看看SQL「join」指令。 – 2011-02-17 08:13:40

3
SELECT DISTINCT category,_id FROM table GROUP BY category; 

認爲這應該給你你在找什麼。從這個結果將是類別,併爲該類別的第一個_id。您可以忽略第二列(_id)。

0

您可以指定你的SELECT語句的_id字段別名,這只是一個恆定值,例如:

SELECT DISTINCT 0 _id, category FROM table;

0

更重要的是,我通過使用解決了這個問題:

SELECT DISTINCT category AS _id FROM table 

現在,你有一個名爲_id的列其中有你在想什麼