Android 在ContentProvider中使用rawQuery是一种好的做法吗?

Android 在ContentProvider中使用rawQuery是一种好的做法吗?,android,android-contentprovider,Android,Android Contentprovider,我正在使用自定义ContentProvider与sqlite数据库通信。我想在列表(使用ListFragment)上显示来自两个表(具有多对多关系)的数据。对于这种情况,我能想到的唯一解决方案是使用rawQuery。问题是,如果这是一个好的实践,或者我应该用其他方式解决这个问题 表格示例: 表A:ID,来自列A的列 表B:ID,来自列的列 连接表AB:ID,FK_ID_A,FK_ID_B ContentProvider中重写的查询方法示例: @Override public Cursor que

我正在使用自定义ContentProvider与sqlite数据库通信。我想在列表(使用ListFragment)上显示来自两个表(具有多对多关系)的数据。对于这种情况,我能想到的唯一解决方案是使用rawQuery。问题是,如果这是一个好的实践,或者我应该用其他方式解决这个问题

表格示例:

表A:ID,来自列A的列

表B:ID,来自列的列

连接表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;
}

这是一个很好的惯例,在这种情况下非常合适


我没有预见到任何问题,我们已经在许多应用程序中使用了它。

我能想到的唯一更好的解决方案是在不使用本机SQL的情况下编写此类查询(使用此交叉表),但使用queryBuilder的查询方法,在我的示例中,该方法用于单个表。我只是还没有找到这样的实现,我不确定这是否可能。这也是可能的,例如
SQLiteQueryBuilder.setTables(“foo LEFT OUTER JOIN bar ON(foo.id=bar.foo_id)”)
以上两个答案都让我非常满意。这就是我要找的。非常感谢。