我在一个SQLite数据库中有两个来自不同表的游标。我尝试将来自两个游标的数据放入一个ListView中,但每个游标的数据格式不同。
我所考虑的是使用MergeCursor来组合这两个游标,但是我的SimpleCursorAdapter的ViewBinder将把它们看作一个单一的游标,并且不能区分格式(除非我改变我的表,我不想这样做)。
最后,我发现了两个名为Cursor.repond(Bundle) & Cursor.getExtras()的方法,但是开发人员控制台上的文档非常简短,谷歌搜索这些方法并没有阐明它们的用法。
我测试了在数据库类中使用resond()进行查询的想法:
extr.putString("table", the_tab);
Cursor c_in = db.rawQuery(qry, null);
c_in.respond(extr);
return c_in;并使用ViewBinder中的getExtras()来了解查询的表,并相应地格式化ListView项:
Bundle extr=cur.getExtras();
String tab= extr.getString("table");但是我总是得到一个例外,tab是null。
在冗长的描述之后,我的问题是:我是否正确地使用了respond和getExtras方法?如果没有,有没有更好的方法来解决我的问题?
发布于 2012-06-15 12:44:58
尝试将表名构建为两个SELECT中的字段。
SELECT "A", * from tableA; SELECT "B", * from tableB;然后计算合并的游标。或者,
SELECT "A", * from tableA UNION ALL SELECT "B", * from tableB;现在,游标的每一行在第一列中都有一个"A",如果它来自tableA,则在第一列中有一个"B";如果它来自tableB,则在第一列中有一个from。因此,可以很容易地在ViewBinder中查看该列来制定格式决定。
发布于 2013-09-05 23:59:18
如果你想在getExtras中使用Bundle,似乎是由AbstractWindowedCursor扩展的AbstractCursor,由SQLiteCursor扩展的AbstractCursor定义了一个setExtras方法。它的文档如下所示
设置将由getExtras()返回的android.os.Bundle。null将被转换为android.os.Bundle.EMPTY。
根据文档,respond用于与Cursor进行带外通信。
所以答案是:
((AbstractCursor) cursor).setExtras(bundle);然后,您应该能够调用
cursor.getExtras();以在以后检索该Bundle。
编辑:
进一步看,由于某种原因,setExtras似乎被标记为隐藏,因此它是公开的,并且打算按照描述(和期望的)使用。请参阅ContactsProvider2 example
因此,我想到了使用CursorWrapper,并覆盖那里的getExtras来提供Bundle。在我的例子中,我在CursorWrapper中创建了Bundle,所以我不需要一个方法来设置它。
@Override
public Bundle getExtras() {
return _meta_data;
}发布于 2012-06-15 13:03:28
我坚持让你看看MergeCursor和AbstractCursor来解决你的问题并得到解决方案。例如,您可以选中this answer。
https://stackoverflow.com/questions/11006511
复制相似问题