2012-07-20 28 views
22

Estoy usando mi ContentProvider personalizado para comunicarme con la base de datos sqlite. Me gustaría mostrar en una lista (usando ListFragment) datos que provienen de dos tablas (con una relación de muchos a muchos). La única solución que puedo pensar para este caso es usar rawQuery. Y la pregunta es, si es una buena práctica, ¿o debería resolver esto de alguna otra manera?¿Es una buena práctica usar rawQuery en ContentProvider?

Ejemplo de tablas:

Tabla A: ID, COLUMN_FROM_A

Tabla B: ID, COLUMN_FROM_B

tabla de unión AB: ID, FK_ID_A, FK_ID_B

Ejemplo de método de consulta reemplazado en ContentProvider:

@Override 
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
    Cursor cursor = null; 
    int uriType = URIMatcher.match(uri); 
    switch (uriType) { 
     case TABLE_A_URI: 
      queryBuilder.setTables("TABLE_A"); 
      cursor = queryBuilder.query(databaseHelper.getReadableDatabase(), projection, selection, selectionArgs, null, null, sortOrder); 
      break; 
     case TABLE_B_URI: 
      queryBuilder.setTables("TABLE_B"); 
      cursor = queryBuilder.query(databaseHelper.getReadableDatabase(), projection, selection, selectionArgs, null, null, sortOrder); 
      break; 
     case TABLE_JOIN_A_B_URI: 
      cursor = databaseHelper.getReadableDatabase().rawQuery("select a.COLUMN_FORM_A, b.COLUMN_FROM_B from TABLE_A a, TABLE_B b, TABLE_AB ab where ab.FK_ID_A=a.ID and ab.FK_ID_B=b.ID", null); 
      break; 
     default: 
      throw new IllegalArgumentException("Unknown URI"); 
    } 

    cursor.setNotificationUri(getContext().getContentResolver(), uri); 
    return cursor; 
} 

Respuesta

12

Es bueno y práctica común, muy apropiada en este caso.

No preveo ningún problema, lo hemos usado en muchas aplicaciones.

+1

La única mejor solución que puedo pensar es una forma de escribir dicha consulta (usando esta tabla cruzada) sin SQL nativo pero usando el método de consulta de queryBuilder, que en mi ejemplo se usa para tablas únicas. Simplemente no he encontrado tal implementación y no estoy seguro si esto es posible. –

+1

También es posible, con por ejemplo 'SQLiteQueryBuilder.setTables (" foo LEFT OUTER JOIN bar ON (foo.id = bar.foo_id) ")' –

+1

Ambas respuestas anteriores me satisfacen mucho. Esto es lo que estaba buscando. Gracias. –

Cuestiones relacionadas