12

我的应用程序CursorLoader用于从主表加载数据。数据将在ListView的帮助下显示CursorAdapter。ListView 中显示的视图也需要来自子表的数据。表的关系是一对多的。

  • 如果我在查询期间加入两个表,合并的记录将与子记录一样多,因此在 中ListView,它将在主表中为一条记录显示多个项目。

  • 如果我不加入表,我不确定在CursorLoader通过游标传递数据后检索子记录的最佳方法是什么。任何人都可以帮助我吗?

4

3 回答 3

1

如果不需要单独查询子表数据,那么您可以使用 JSON 表示法将该数据放入主表中,然后在 CursorAdapter 的 bindView 方法中将其解析出来。根据子表中数据的复杂性,这可能会出现性能问题。但这将允许您使用单个光标。

您可以采取的另一种方法是创建一个 DAO 对象,将原始查询作为连接运行(因此您可以获得多行),然后将游标处理为 List,其中 Foo 是表示数据的 POJO。(或运行 n+1 个查询 - 主查询,然后是每行的子查询)。然后制作一个调用 DAO 以返回 List 并从中使用 ListAdapter 的 Loader。您的自定义加载程序仍然可以注册数据更改通知并进行重新加载。我使用 CursorLoader 作为一种模式来制作我自己的加载器,当我不想弄乱 ListView 中的光标时,它会重新加载,并且效果很好。

于 2012-07-11T03:53:53.043 回答
0

您应该尝试连接选项并为查询设置排序顺序,以确保结果按主表中的结果排序。

之后,您可以使用ExpandableListView显示主项和下面的所有子项,以很好地指示“一对多”关系。当然,您需要适当地编写适配器来处理这种情况。

于 2012-07-15T01:22:42.077 回答
0

如果你想从子表中获取聚合数据,你应该在sql语句中使用'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
于 2012-07-18T06:26:46.720 回答