android - Cuándo usar CursorJoiner/MatrixCursor/MergeCursor?
(2)
Estoy explorando diferentes maneras de obtener datos elegantemente de dos o más tablas unidas.
Creo que MergeCursor
, ( Android Developer Guide ) parece implicar que podría (por ejemplo) reemplazar un SQL UNION
equivalente al concatenar dos consultas (o agregar vistas individualmente como filas, etc.), así que no es lo que quiero.
Pero no sé para qué CursorJoiner
exactamente CursorJoiner
y MatrixCursor
, o cómo usarlos. He buscado su fuente y (como de costumbre) ¡no significa nada para mí! Los ejemplos que encontré de ellos en uso no explicaron claramente cuál fue el efecto resultante. Realmente apreciaría una buena descripción de ellos, y el contexto en el que podrían ser utilizados.
Con respecto a MatrixCursor , aquí hay un uso de ejemplo.
Esto devuelve una versión descifrada de los datos ( en este caso, solo una columna, pero en la versión completa se encriptan varias columnas ).
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;
}
En resumen, es un poco diferente al uso de un cursor normal, excepto que usted define las columnas cuando crea una instancia. Luego puede agregar filas con el método addRow
.
MergeCursor
, como usted indica, está diseñado para concatenar dos conjuntos de datos "verticalmente", agregando más filas.
CursorJoiner
está diseñado para concatenar dos conjuntos de datos "horizontalmente" y agregar más columnas. Puede pensar que esto es similar a implementar un simple SQL JOIN
.
MatrixCursor
permite construir algo que implemente la interfaz del Cursor
sin datos puros, que vierte en un modelo de datos bidimensional.
AbstractCursor
permite ajustar su propio conjunto de datos personalizados en una interfaz de Cursor
, anulando los métodos que sean necesarios.