【问题标题】:Is it a good practice to use rawQuery in ContentProvider?在 ContentProvider 中使用 rawQuery 是一种好习惯吗?
【发布时间】:2012-07-20 11:55:15
【问题描述】:

我正在使用我的自定义 ContentProvider 与 sqlite 数据库进行通信。我想在一个列表(使用 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;
}

【问题讨论】:

    标签: android android-contentprovider


    【解决方案1】:

    这是一种很好的常见做法,在这种情况下非常合适。

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

    【讨论】:

    • 我能想到的唯一更好的解决方案是编写这样的查询(使用此交叉表)而不使用本机 SQL,而是使用 queryBuilder 中的查询方法,在我的示例中用于单个表。我只是还没有找到这样的实现,我不确定这是否可能。
    • 也可以,例如SQLiteQueryBuilder.setTables("foo LEFT OUTER JOIN bar ON (foo.id = bar.foo_id)")
    • 以上两个答案都很让我满意。这就是我一直在寻找的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2013-03-30
    • 2015-09-02
    • 2019-03-11
    • 2020-04-24
    • 1970-01-01
    相关资源
    最近更新 更多