使用rawQuery的CursorLoader

时间:2011-09-29 15:11:25

标签: android

我正在考虑在我的应用程序中实现CursorLoader,但我遇到一个小问题,似乎没有办法将原始查询传递给CursorLoader构造函数。

我可能在文档(和谷歌)中遗漏了一些内容,所以如果有人能指出我使用CursorLoader类运行原始查询的简单方法,我将不胜感激。否则我将不得不创建自己的CursorLoader类,其中包含必要的功能,我正试图避免这种功能。

4 个答案:

答案 0 :(得分:8)

  

似乎没有办法将原始查询传递给CursorLoader构造函数。

这是因为CursorLoader适用于内容提供商,内容提供商不支持rawQuery()

  

所以,如果有人能指出我使用CursorLoader类运行原始查询的简单方法,我将不胜感激。

这是不可能的,对不起。欢迎您创建自己的AsyncTaskLoader,它可以访问SQLite数据库并支持rawQuery()。事实上,如果我没有看到任何人打败我的话,我今年晚些时候可能会写下其中的一篇。

答案 1 :(得分:7)

不直接支持原始查询,但您可以通过代码调用执行脏黑客攻击 getContentResolver().query(RAWQUERY_CONTENT_URI, null, rawquery, args, null); 并实现像

这样的内容提供者
@Override
public synchronized Cursor query(Uri uri, String[] projection, String selection,
       String[] selectionArgs, String sortOrder)
{
    int uriType = sURIMatcher.match(uri);
    switch (uriType)
    {
        case RAW_QUERY:
        return dbHelper.getReadableDatabase().rawQuery(selection, selectionArgs);
    }
[...]
}

答案 2 :(得分:1)

**对于使用内容提供商的自定义搜索**

将Cursor Loader更改为Follow(在onCreateLoader中)

return new CursorLoader(
        getActivity(),                        // Context
        PRODUCT.CONTENT_URI,                  // URI
        PROJECTION,                           // Projection
        PRODUCT.PRODUCT_NAME+ " like ?",      // Selection
        new String[]{"%" + mCurFilter + "%"}, // Selection args
        PRODUCT.PRODUCT_NAME + " asc"); 

在您的提供商变更中

//C is Cursor object
switch (uriMatch) {
        case ROUTE_PRODUCT_ID:
            // Return a single entry, by ID.
            String id = uri.getLastPathSegment();
            builder.where(PRODUCT._ID + "=?", id);
            c = builder.query(db, projection, sortOrder);
            assert ctx != null;
            c.setNotificationUri(ctx.getContentResolver(), uri);
            return c;
//          break;
        case ROUTE_PRODUCT:
            // Return all known entries.
            builder.table(PRODUCT.PRODUCT_TABLE_NAME)
            .where(selection, selectionArgs);
            c = builder.query(db, projection, sortOrder);
            assert ctx != null;
            c.setNotificationUri(ctx.getContentResolver(), uri);
            return c;

答案 3 :(得分:0)

您可以使用原始查询实现自己的CursorLoader。这是原始CursorLoader的来源:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/content/CursorLoader.java