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;
}
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. –
También es posible, con por ejemplo 'SQLiteQueryBuilder.setTables (" foo LEFT OUTER JOIN bar ON (foo.id = bar.foo_id) ")' –
Ambas respuestas anteriores me satisfacen mucho. Esto es lo que estaba buscando. Gracias. –