3

我有 2 个来自 SQLite 数据库中不同表的游标。我试图将两个游标中的数据合二为一,ListView但每个游标的数​​据格式不同。

我的想法是使用 aMergeCursor来组合两个光标,但ViewBinderfor mySimpleCursorAdapter会将它们视为单个光标,并且无法区分格式(除非我更改我不想这样做的表格)。

最后,我找到了两个名为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;

并在 中使用getExtras()ViewBinder了解查询表并ListView相应地格式化项目:

Bundle extr=cur.getExtras();
String tab= extr.getString("table");

但我总是遇到一个tab例外null

经过这么长的描述后,我的问题是:我是否正确使用了respondandgetExtras方法?如果没有,是否有更好的方法来解决我的问题?

4

4 回答 4

2

如果你想使用BundleingetExtras似乎AbstractCursorwhich is extended by AbstractWindowedCursorwhich is extended bySQLiteCursor定义了一个setExtras方法。它的文档读取

设置将由 getExtras() 返回的 android.os.Bundle。null 将被转换为 android.os.Bundle.EMPTY。

respondCursor根据文档,用于带外通信。

所以答案是:

((AbstractCursor) cursor).setExtras(bundle);

然后你应该可以打电话

cursor.getExtras();

在稍后的时间来检索那个Bundle

编辑:

进一步看,似乎setExtras由于某种原因被标记为隐藏,因此它是公开的,并且旨在按照描述(和期望)使用。请参阅ContactsProvider2 示例

所以,我想出了使用CursorWrapper,并覆盖getExtras那里提供Bundle. 就我而言,我在 中创建BundleCursorWrapper所以我不需要设置它的方法。

@Override
public Bundle getExtras() {
    return _meta_data;
}
于 2013-09-05T15:59:17.763 回答
2

尝试将表名构建为两个SELECTs 中的字段。

SELECT "A", * from tableA;  SELECT "B", * from tableB;

然后计算一个合并的游标。交替,

SELECT "A", * from tableA UNION ALL SELECT "B", * from tableB;

现在游标的每一行将"A"在第一列中有一个如果它来自tableA和一个"B"如果它来自tableB。因此,您可以轻松查看此列ViewBinder来做出格式决定。

于 2012-06-15T04:44:57.973 回答
0

这是另一种选择(尽管您不应该使用它):

Class.forName("android.database.AbstractCursor")
        .getMethod("setExtras", new Class[]{Bundle.class})
        .invoke(c_in, extr);
于 2015-01-06T20:18:14.760 回答
0

我会坚持让你看看MergeCursorAbstractCursor解决你的问题并找到解决方案。例如,您可以检查this答案。

于 2012-06-15T05:03:28.233 回答