2011-04-18 7 views
36

Estoy explorando diferentes maneras de obtener datos elegantemente de dos o más tablas unidas.Cuándo usar CursorJoiner/MatrixCursor/MergeCursor?

Creo MergeCursor, (Android Developer Guide) parece dar a entender que podría (por ejemplo) reemplazar un equivalente SQL UNION mediante la concatenación de dos consultas (o la adición de puntos de vista individual como filas, etc) - es así, no lo que yo quiero.

Pero no sé qué es 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 usarse.

Respuesta

71

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", agregando más columnas. Puedes pensar que esto es similar a implementar un simple SQL JOIN.

MatrixCursor le permite construir algo que implemente la interfaz Cursor sin datos puros, que vierta en un modelo de datos bidimensional.

AbstractCursor le permite ajustar su propio conjunto de datos personalizado en una interfaz Cursor, anulando los métodos que sean necesarios.

+1

Gracias, ahora estoy claro en MergeCursor y CursorJoiner. Todavía estoy algo desconcertado sobre MatrixCursor. Tal vez debería leer sobre la extensión de AbstractCursor. – Jodes

+3

@Jodes: "MatrixCursor es útil si tiene una colección de datos que no está en la base de datos y desea crear un cursor para ella". [Android Advanced Cursors] (http://chariotsolutions.com/blog/post/android-advanced-cursors/) –

+1

Respuesta extremadamente útil. El punto interesante aquí es que 'CursorJoiner' no es un objeto' Cursor', por lo tanto es (casi) completamente inútil porque si quieres acceder a los datos unidos como en un 'Cursor' necesitas crear manualmente un' MatrixCursor' de (sin utilidad u otros métodos disponibles para hacer esta tarea por cierto). – bonnyz

0

Con respecto a MatrixCursor, he aquí un ejemplo de uso.

Esto devuelve una versión descifrada de los datos (en este caso solo una columna, pero en la versión completa se encriptan un número de 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 define las columnas cuando crea una instancia. Luego puede agregar filas con el método addRow.

Cuestiones relacionadas