30

データベースから取得したデータのリストを表示するスピナーがあります。データはクエリからカーソルに返され、カーソルはスピナーの SimpleCursorAdapter に渡されます。このように問題なく動作していますが、このデータの上に別のアイテムを挿入したいです。たとえば、スピナーは既に DB に保存されているユーザー作成のテンプレートのリストを表示していますが、テンプレートのリストの上に「新しいテンプレート」と「空のテンプレート」を挿入したいので、Cursor/SimpleCursorAdapter に挿入する必要があります。何とかして。

配列リストを使用してカーソルから配列リストにデータを入力することを検討しましたが、カーソルには他の関連するデータ行も含まれているため、より良い解決策です。インターネットで他の解決策を検索したところ、この目的で CursorWrapper を使用するよう求める回答がいくつか見つかりましたが、CursorWrapper を使用して目的を達成する具体的な例は見つかりませんでした。カーソルにいくつかの行を挿入するにはどうすればよいですか、または誰かがCursorWrapperのわかりやすい例を教えてください!! 前もって感謝します。

4

3 に答える 3

91

次のようにMergeCursorMatrixCursorDB を組み合わせて使用​​できます。cursor

MatrixCursor extras = new MatrixCursor(new String[] { "_id", "title" });
extras.addRow(new String[] { "-1", "New Template" });
extras.addRow(new String[] { "-2", "Empty Template" });
Cursor[] cursors = { extras, cursor };
Cursor extendedCursor = new MergeCursor(cursors);
于 2013-01-31T09:50:04.713 に答える
2

これは私が試した方法です。

MatrixCursor m = new MatrixCursor(c.getColumnNames());
Cursor c = DBHelper.rawQuery("Select values from your_table");
MatrixCursor m = new MatrixCursor(c.getColumnNames());

//Use MatrixCursor#addRow here to add before the original cursor

while (c.moveToNext()) {
    //Use MatrixCursor#addRow here to add before the original row
    DBHelper.insertRow(c, m);
    //Use MatrixCursor#addRow here to add after the original row

}
//Use MatrixCursor#addRow here to add after the original cursor

m.addRow(new String[]{col1Val, col2Val, col3Val,..., //to match the number of columns needed});

DBHelper.insertRow()

public final static void insertRow(Cursor from, MatrixCursor to) {
final String columns[] = from.getColumnNames(), values[] = new String[columns.length];
    final int size = columns.length;

    for (int i = 0; i < size; i++) {
        values[i] = getStringFromColumn(from, columns[i]);
    }
    to.addRow(values);
}

この方法を使用すると、カーソル内の任意の場所に任意の数の行を追加できます。CursorWrapper を使用していませんが、CursorAdapter または SimpleCursorAdapter で使用できます。

于 2014-01-14T09:27:37.113 に答える