2012-07-20 12 views
22

Używam mojego niestandardowego ContentProvider do komunikowania się z bazą danych sqlite. Chciałbym wyświetlić na liście (przy użyciu ListFragment), dane, które pochodzą z dwóch tabel (z wielu do wielu relacji). Jedynym rozwiązaniem, jakie mogę wymyślić dla takiego przypadku, jest użycie narzędzia rawQuery. Pytanie brzmi: czy jest to dobra praktyka, czy też powinienem rozwiązać to w jakiś inny sposób?Czy dobrą praktyką jest używanie narzędzia rawQuery w narzędziu ContentProvider?

Przykład tabelach:

Tabela A: identyfikator, COLUMN_FROM_A

Tabela B: identyfikator, COLUMN_FROM_B

Połączenie tabeli AB ID, FK_ID_A, FK_ID_B

Przykład zastąpionej metodą zapytania w 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; 
} 

Odpowiedz

12

To dobrze i powszechna praktyka, bardzo odpowiednia w tym przypadku.

Nie przewiduję żadnych problemów, użyliśmy go w wielu aplikacjach.

+1

Jedynym lepszym rozwiązaniem, jakie mogę wymyślić jest sposób napisania takiego zapytania (przy użyciu tej tabeli krzyżowej) bez natywnego SQL, ale przy użyciu metody zapytań z queryBuilder, który w moim przykładzie jest używany dla pojedynczych tabel. Po prostu nie znalazłem takiej implementacji i nie jestem pewien, czy to nawet możliwe. –

+1

Jest to również możliwe, na przykład przy użyciu 'SQLiteQueryBuilder.setTables (" foo LEWEJ LEWEGO ZŁĄCZA ZEWNĘTRZNEGO paska na ON (foo.id = bar.foo_id) ")' –

+1

Obie powyższe odpowiedzi bardzo mnie satysfakcjonują. Tego właśnie szukałem. Dziękuję Ci. –

Powiązane problemy