Ich verwende meinen eigenen ContentProvider, um mit der SQLite-Datenbank zu kommunizieren. Ich möchte Daten, die aus zwei Tabellen stammen (mit einer Many-to-Many-Beziehung), in einer Liste (mit ListFragment) anzeigen. Die einzige Lösung, die ich mir für einen solchen Fall vorstellen kann, ist die Verwendung von rawQuery. Und die Frage ist, ob das eine gute Praxis ist oder ob ich das auf andere Weise lösen sollte?
Beispiel für Tabellen:
Tabelle A: ID, SPALTE_VON_A
Tabelle B: ID, SPALTE_VON_B
Verknüpfungstabelle AB: ID, FK_ID_A, FK_ID_B
Beispiel für die überschriebene Abfrage-Methode im 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("Unbekannte URI");
}
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}