Когда использовать CursorJoiner / MatrixCursor / MergeCursor? - PullRequest
37 голосов
/ 18 апреля 2011

Я изучаю различные способы элегантного получения данных из двух или более объединенных таблиц.

Я считаю, MergeCursor, ( Руководство разработчика Android ), по-видимому, подразумевает, что может (например) заменить эквивалент SQL UNION путем объединения двух запросов (или добавления отдельных представлений в виде строк и т. Д.) так что не то, что я хочу.

Но я в растерянности относительно того, для чего именно CursorJoiner и MatrixCursor, или как их использовать. Я посмотрел на источник для них и (как обычно) это ничего не значит для меня! Примеры, которые я нашел в их использовании, не ясно объясняют, каков был результат. Я был бы очень признателен за хорошее описание их и контекст, в котором они могут быть использованы.

Ответы [ 2 ]

72 голосов
/ 18 апреля 2011

MergeCursor, как вы указываете, предназначен для объединения двух наборов данных "по вертикали", добавляя больше строк.

CursorJoiner предназначен для объединения двух наборов данных «по горизонтали» с добавлением дополнительных столбцов. Вы можете думать об этом как о реализации простого SQL JOIN.

MatrixCursor позволяет создавать из чистых данных нечто, реализующее интерфейс Cursor, которое вы вливаете в двумерную модель данных.

AbstractCursor позволяет вам обернуть свой собственный набор данных в интерфейсе Cursor, переопределяя необходимые методы.

0 голосов
/ 15 сентября 2017

Что касается MatrixCursor , вот пример использования.

Возвращает расшифрованную версию данных ( в данном случае только один столбец, но в полной версии количество столбцов зашифровано ).

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.

...