3

SQLiteデータベースの異なるテーブルから2つのカーソルがあります。2つのカーソルからのデータを1つに入れようとしていますがListView、各カーソルからのデータのフォーマットが異なります。

私が考えたのはMergeCursor、両方のカーソルを結合するためにaを使用することですが、ViewBinderforSimpleCursorAdapterはそれらを単一のカーソルとして認識し、フォーマットを区別することはできません(テーブルを変更しない限り、実行したくありません)。

最後に、Cursor.repond(Bundle)&という2つのメソッドを見つけまし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

この長い説明の後の私の質問は次のとおりです:私はrespondgetExtrasメソッドを正しく使用していますか?そうでない場合、私の問題に対するより良いアプローチはありますか?

4

4 に答える 4

2

2つののフィールドとしてテーブル名を作成してみてくださいSELECT

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

次に、マージされたカーソルを計算します。または、

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

これで、カーソルの各行の"A"最初の列に、から来た場合はaが、から来た場合はtableAaが表示されます。したがって、フォーマットを決定するため に、この列を簡単に確認できます。"B"tableBViewBinder

于 2012-06-15T04:44:57.973 に答える
2

を使用したい場合はBundle、それによって拡張されたものがメソッドを定義しgetExtrasているように見えます。ドキュメントには次のように書かれていますAbstractCursorAbstractWindowedCursorSQLiteCursorsetExtras

getExtras()によって返されるandroid.os.Bundleを設定します。nullはandroid.os.Bundle.EMPTYに変換されます。

respondCursorドキュメントによると、との帯域外通信に使用されます。

したがって、答えは次のとおりです。

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

その後、あなたは呼び出すことができるはずです

cursor.getExtras();

後でそれを取得しBundleます。

編集:

さらに見てみると、setExtras何らかの理由で非表示になっているように見えるので、公開されており、説明されているように(そして望ましいように)使用することを目的としています。ContactsProvider2の例を参照してください

CursorWrapperそこで、を使用して、そこをオーバーライドしgetExtrasてを提供することを思いつきましたBundle。私の場合、で作成するBundleのでCursorWrapper、設定する方法は必要ありません。

@Override
public Bundle getExtras() {
    return _meta_data;
}
于 2013-09-05T15:59:17.763 に答える
0

MergeCursor私はあなたがあなたの問題を見て、AbstractCursor回避して解決策を得るようにあなたに主張します。たとえば、this答えを確認できます。

于 2012-06-15T05:03:28.233 に答える
0

別の方法は次のとおりです(ただし、使用しないでください)。

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