我的应用正在使用CursorLoader
从主表加载数据。在ListView
的帮助下,数据将显示在CursorAdapter
中。 ListView中显示的视图还需要子表中的数据。表的关系是一对多的。
如果我在查询期间加入两个表,则组合记录将与子记录一样多,因此在ListView
中,它将在主表中显示一个记录的多个项目。
如果我不加入该表,我不确定在CursorLoader
通过游标传递数据后检索子记录的最佳方法是什么。有人能帮帮我吗?
答案 0 :(得分:1)
如果不需要单独查询子表数据,那么可以使用JSON表示法将数据放入主表中,然后在CursorAdapter的bindView方法中解析出来。这可能会出现性能问题,具体取决于子表中数据的复杂性。但这样就可以使用单个游标。
您可以采用的另一种方法是创建一个DAO对象,该对象将原始查询作为连接运行(因此您获得多行),然后将光标处理到List,其中Foo是表示数据的POJO。 (或运行n + 1个查询 - 主查询,然后是每行的子查询)。然后创建一个调用DAO的Loader来返回List并使用ListAdapter。您的自定义加载程序仍然可以注册数据更改通知并执行重新加载。我已经使用CursorLoader作为模式来制作我自己的加载器,当我不想在ListView中弄乱Cursor并且它运行良好时重新加载。
答案 1 :(得分:0)
您应该尝试连接选项并为查询设置排序顺序,以确保结果按主表中的结果排序。
之后,您可以使用ExpandableListView来显示主要项目和下面的所有子项目,以便以良好的方式指示“一对多”关系。当然,您需要适当地编写适配器来处理这种情况。
答案 2 :(得分: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