Когда использовать 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
метод.