Когда использовать CursorJoiner / MatrixCursor / MergeCursor?

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

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

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

2 ответа

Решение

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

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

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

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

Что касается 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 метод.

Другие вопросы по тегам