22 Stimmen

Ist es eine gute Praxis, rawQuery in ContentProvider zu verwenden?

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;
}

12voto

ᅙᄉᅙ Punkte 16811

Es ist eine gute und übliche Praxis, die in diesem Fall sehr angemessen ist.

Ich sehe keine Probleme voraus, wir haben es in vielen Apps verwendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X