22
我正在使用我的自定義ContentProvider與sqlite數據庫進行通信。我想顯示在一個列表(使用ListFragment),來自兩個表(具有多對多關係)的數據。我能想到的唯一解決方案就是使用rawQuery。問題是,如果這是一個好的做法,或者我應該以其他方式解決這個問題?表在ContentProvider中使用rawQuery是一個好習慣嗎?
實施例:
表A:ID,COLUMN_FROM_A
表B:ID,COLUMN_FROM_B
加入表AB:重寫查詢方法的ID,FK_ID_A,FK_ID_B
實施例在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;
}
我能想到的唯一更好的解決方案是使用queryBuilder編寫這樣的查詢(使用這個跨表)的方式,而不使用本機SQL,但使用queryBuilder中的查詢方法,這在我的示例中用於單個表。我只是沒有找到這樣的實現,我不知道這是甚至可能的。 – 2012-07-20 12:37:57
也可以,例如'SQLiteQueryBuilder.setTables(「foo LEFT OUTER JOIN bar ON(foo.id = bar.foo_id)」)' – 2012-07-20 14:35:51
以上兩個答案都非常滿足我。這是我正在尋找的。謝謝。 – 2012-07-23 08:09:32