37

2つ以上の結合されたテーブルからエレガントにデータを取得するさまざまな方法を模索しています。

MergeCursorAndroid開発者ガイド)は、(たとえば)SQL UNION2つのクエリを連結する(またはビューを行として個別に追加するなど)ことで同等のものを置き換えることができることを示唆しているようです-したがって、私が望むものではありません。

しかし、私は正確に何のためにあるのか、またはそれらをどのように使用するのかについて途方に暮れていCursorJoinerますMatrixCursor。私はそれらのソースを調べましたが、(いつものように)それは私には何の意味もありません!私が見つけたそれらの使用例は、結果として生じる効果が何であるかを明確に説明していませんでした。それらの良い説明と、それらが使用される可能性のあるコンテキストを本当にいただければ幸いです。

4

2 に答える 2

72

MergeCursorは、ご指摘のとおり、2つのデータセットを「垂直に」連結して行を追加するように設計されています。

CursorJoiner2つのデータセットを「水平方向に」連結し、列を追加するように設計されています。これは、単純なを実装することに似ていると考えることができますSQL JOIN

MatrixCursor純粋なデータからインターフェースを実装するものを構築しCursor、それを2次元データモデルに注ぎ込むことができます。

AbstractCursorCursor必要なメソッドをオーバーライドして、独自のカスタムデータセットをインターフェイスでラップできます。

于 2011-04-18T12:54:19.283 に答える
0

MatrixCursorに関して、使用例を次に示します。

これにより、復号化されたバージョンのデータが返されます(この場合、1つの列のみですが、完全なバージョンでは、多数の列が暗号化されます)。

public MatrixCursor decyrptedCard(long cardid) {
    EncryptDecrypt ed = new EncryptDecrypt(mContext,
            LoginActivity.getCurrentUserPassWord(),
            MainActivity.mCurrentUserid);
    String[] mcsrcolumns = {
            DBCardsTableConstants.CARDID.getDBColumnName(),
            DBCardsTableConstants.CARDNAMEONCARD.getDBColumnName()
    };
    MatrixCursor cnvcsr = new MatrixCursor(mcsrcolumns,0);
    String whereclause = DBCardsTableConstants.CARDID.getDBColumnName() +
            "=?";
    String[] whereargs = {Long.toString(cardid)};

    Cursor basecsr = db.query(DBCardsTableConstants.CARDS.getDBTableName(),
            null,
            whereclause,
            whereargs,
            null,null,null,null);
    if (!basecsr.moveToFirst()) {
        cnvcsr.addRow(new Object[]{0L,"NOTACARD"});
        return cnvcsr;
    }

    cnvcsr.addRow(new Object[]{
            basecsr.getLong(
                    basecsr.getColumnIndex(
                            DBCardsTableConstants.CARDID.getDBColumnName()
                    )),
            ed.decrypt(
                    basecsr.getString(
                            basecsr.getColumnIndex(
                                    DBCardsTableConstants.CARDNAMEONCARD.getDBColumnName()
                            )
                    )
            )
    });
    basecsr.close();
    return cnvcsr;
}

つまり、インスタンスを作成するときに列を定義することを除いて、通常のカーソルを使用する場合と少し異なります。次に、メソッドを使用して行を追加できますaddRow

于 2017-09-15T08:01:00.710 に答える