Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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