2011-09-28 48 views
12

我的應用程序正在使用CursorLoader加載主表中的數據。數據將在CursorAdapter的幫助下顯示在ListView。在ListView中顯示的視圖也需要來自子表的數據。這些表格的關係是一對多的。如何使用從主表加載數據的CursorLoader從子表檢索數據?

  • 如果我加入了查詢過程中兩個表,合併記錄將有多達子記錄,從而在ListView,它會顯示多個項目在主表中的一個單獨的記錄。

  • 如果我沒有加入表格,我不確定在CursorLoader通過光標傳送數據後檢索子記錄的最佳方法。任何人都可以幫助我?

+0

您是否找到了答案?我正在尋找類似的東西。我也希望有兩個表,一對多的關係;我正在尋找一種使用'Loader'來加載數據的有效方法。 – curioustechizen

回答

0

您應該嘗試連接選項併爲您的查詢設置排序順序,以確保結果按主表中的結果排序。

之後,您可以使用ExpandableListView來顯示主項目和下面的所有子項目,以良好方式指示「一對多」關係。當然,您需要適當編寫適配器來處理這種情況。

1

如果孩子表數據並不需要單獨查詢,那麼你可以將數據放到使用類似JSON對象主表,然後解析出來的bindView方法CursorAdapter的內部。這可能會導致性能問題,具體取決於子表中數據的複雜程度。但是,這將允許您使用單個遊標。

你可以採取的另一種方法是創建一個DAO對象,將原始查詢作爲連接運行(以便獲取多行),然後將其光標處理爲List,其中Foo是表示數據的POJO。 (或者運行n + 1個查詢 - 主查詢,然後運行每行的子查詢)。然後使一個調用DAO的Loader返回一個List,並使用ListAdapter。您的自定義加載器仍然可以註冊數據更改通知並執行重新加載。我已經使用CursorLoader作爲模式來創建我自己的加載器,當我不想混淆ListView中的Cursor時它會重新加載,並且效果很好。

+0

3年後,我仍然無法找到解決此問題的更好方法。你的建議是在父表中使用一個列來保存子數據的json表示,這對我的用例非常有用。我的一對多大約是1到「一小撮」,因此從收集到json數組的序列化時間非常短,因爲存儲字符串所需的空間也非常小。我還將子記錄存儲在一張單獨的表格中,以便於查詢是否需要。感謝大家的建議。 – Mario

+0

感謝您的評論。很高興知道我在幫忙!我仍然使用這種方法作爲存儲子數據的簡單方法。接受的答案也很好,特別是如果數據以可擴展列表視圖呈現。 – harmanjd

0

如果你想從子表中的合計數據,你應該在SQL statements.for例如,兩個表使用「GROUP BY」:

parent(id,name) 
child(id,parentId,age) 

查詢所有父母最古老的孩子:

select a.id,a.name,max(b.age) 
from parent as a inner join child as b on a.id=b.parentId 
group by a.id,a.name