22

カスタム ContentProvider を使用して sqlite データベースと通信しています。2 つのテーブル (多対多の関係) からのデータを (ListFragment を使用して) リストに表示したいと考えています。このような場合に考えられる唯一の解決策は、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;
}
4

1 に答える 1

12

これは良い一般的な方法であり、この場合に非常に適しています。

問題はないと思います。多くのアプリで使用しています。

于 2012-07-20T12:02:44.743 に答える