Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 带rawQuery的游标加载程序_Android - Fatal编程技术网

Android 带rawQuery的游标加载程序

Android 带rawQuery的游标加载程序,android,Android,我正在研究在我的应用程序中实现CursorLoader,但我遇到了一个小问题,似乎没有办法只将原始查询传递给CursorLoader构造函数 我可能在文档(和google)中遗漏了一些东西,所以如果有人能给我一个简单的方法来运行一个带有游标装入器类的原始查询,我将不胜感激。否则,我可能必须创建自己的带有必要功能的CursorLoader类,这是我试图避免的 似乎没有一种方法只需将原始查询传递给CursorLoader构造函数 这是因为CursorLoader与内容提供者一起工作,而内容提供者不支

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

我可能在文档(和google)中遗漏了一些东西,所以如果有人能给我一个简单的方法来运行一个带有游标装入器类的原始查询,我将不胜感激。否则,我可能必须创建自己的带有必要功能的CursorLoader类,这是我试图避免的

似乎没有一种方法只需将原始查询传递给CursorLoader构造函数

这是因为
CursorLoader
与内容提供者一起工作,而内容提供者不支持
rawQuery()

所以,如果有人能给我一个简单的方法来运行一个带有游标装入器类的原始查询,我将不胜感激


那是不可能的,对不起。欢迎您创建自己的
AsyncTaskLoader
,它可以访问SQLite数据库并支持
rawQuery()
。事实上,今年晚些时候,如果我看不出有人比我强的话,我可能会写一篇这样的文章。

原始查询不直接受支持,但你可以做一个肮脏的黑客:从你的代码调用
getContentResolver().query(RAWQUERY\u CONTENT\u 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);
    }
[...]
}

**用于使用内容提供程序进行自定义搜索**

更改光标加载器,如下所示(在onCreateLoader中)

在您的提供商中,相应地进行更改

//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;

您可以使用原始查询实现自己的游标加载程序。这是原始游标加载程序的来源:

这将是一个开始:我不确定这是否完全是真的,可能已经让我吃了两天的青鱼。我在SQLiteOpenHelper中有一个rawQuery,其中包含所有实际查询。我从一个由cursorloader启动的内容提供商那里调用它,它似乎工作得很好。@kpierce8:OP试图将一个“原始查询”传递给
cursorloader
,这是不受严格支持的。OP没有讨论
ContentProvider
的实现,您正在使用
SQLiteOpenHelper
rawQuery()
。现在,肯定有人可以实现一个
ContentProvider
,其中传入了一个“原始查询”,例如
query()
的第三个参数,而不是一个简单的
where
子句(或等效项)。而且,对于特定的
ContentProvider
,您可以将“原始查询”传递给
CursorLoader
。但是,这不是一种典型的方法。如果需要从原始查询Uri访问两个表,如何编写内容Uri。
//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;