2012-07-20 5 views
22

Sto utilizzando il mio ContentProvider personalizzato per comunicare con il database SQLite. Vorrei visualizzare su una lista (usando ListFragment), i dati che provengono da due tabelle (con molti a molti relazione). L'unica soluzione che posso pensare per questo caso è usare rawQuery. E le domande sono, se è una buona pratica, o dovrei risolvere questo in qualche altro modo?È buona norma utilizzare rawQuery in ContentProvider?

Esempio di tabelle:

Tabella A: ID, COLUMN_FROM_A

Tabella B: ID, COLUMN_FROM_B

tabella giunzione AB: ID, FK_ID_A, FK_ID_B

Esempio di metodo di query override in 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; 
} 

risposta

12

È una buona e pratica comune, molto appropriato in questo caso.

Non prevedo alcun problema, l'abbiamo utilizzato in molte app.

+1

L'unica soluzione migliore che riesco a pensare è un modo di scrivere tale query (utilizzando questa tabella incrociata) senza SQL nativo ma utilizzando il metodo query di queryBuilder, che nel mio esempio viene utilizzato per le singole tabelle. Non ho trovato una tale implementazione e non sono sicuro che sia possibile. –

+1

È anche possibile, con ad esempio 'SQLiteQueryBuilder.setTables (" foo LEFT OUTER JOIN bar ON (foo.id = bar.foo_id) ")' –

+1

Entrambe le risposte sopra soddisfatte molto. Questo è quello che stavo cercando. Grazie. –