我正在寻找在我的应用程序中实现CursorLoader,但我有一个小问题,似乎没有办法只是传递一个原始查询到CursorLoader构造函数。CursorLoader与rawQuery
我可能在文档(和谷歌)中缺少一些东西,所以如果任何人都可以指向我一个简单的方式来运行带有CursorLoader类的原始查询,我将不胜感激。否则,我将不得不用必要的功能创建我自己的CursorLoader类,这是我试图避免的。
我正在寻找在我的应用程序中实现CursorLoader,但我有一个小问题,似乎没有办法只是传递一个原始查询到CursorLoader构造函数。CursorLoader与rawQuery
我可能在文档(和谷歌)中缺少一些东西,所以如果任何人都可以指向我一个简单的方式来运行带有CursorLoader类的原始查询,我将不胜感激。否则,我将不得不用必要的功能创建我自己的CursorLoader类,这是我试图避免的。
似乎没有办法只是将原始查询传递给CursorLoader构造函数。
这是因为CursorLoader
适用于内容提供商,而内容提供商不支持rawQuery()
。
所以,如果有人可以指向我一个简单的方法来运行一个CursorLoader类的原始查询,我将不胜感激。
这是不可能的,对不起。欢迎您创建自己的AsyncTaskLoader
,它可以访问SQLite数据库并支持rawQuery()
。事实上,如果我没有看到有人把我打败了,我可能会在今年晚些时候写一篇。
原始查询不直接支持,但你可以做一个肮脏的黑客:像
@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);
}
[...]
}
我如何编写内容Uri如果我需要访问两个表来回原始查询uri。 –
**对于自定义搜索使用内容提供商从您的代码调用 getContentResolver().query(RAWQUERY_CONTENT_URI, null, rawquery, args, null);
和实施内容提供商**
更改光标装载机如下(以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");
在您的供应商赞GE因此
//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;
这将是一个开始:http://stackoverflow.com/questions/7182485/usage-cursorloader-without-contentprovider –
我不知道这是完全真实的,可能造成我2几天的红鲱鱼。我在我的SQLiteOpenHelper中有一个rawQuery,我有我所有的实际查询。我从一个由cursorloader启动的内容提供者调用它,它似乎工作正常。 – kpierce8
@ kpierce8:OP正在尝试将“原始查询”传递给“CursorLoader”,这不是严格支持的。 OP没有讨论ContentProvider的*实现*,它是你使用SQLiteOpenHelper和rawQuery()的地方。现在,有人可能实现一个ContentProvider,其中一个“原始查询”被传入,比如说query()的第三个参数,而不是简单的WHERE子句(或者等价的)。而且,对于特定的'ContentProvider',您可以将“原始查询”传递给'CursorLoader'。但是,这不是一个典型的方法。 – CommonsWare