我正在考虑在我的应用程序中实现CursorLoader,但我遇到一个小问题,似乎没有办法将原始查询传递给CursorLoader构造函数。
我可能在文档(和谷歌)中遗漏了一些内容,所以如果有人能指出我使用CursorLoader类运行原始查询的简单方法,我将不胜感激。否则我将不得不创建自己的CursorLoader类,其中包含必要的功能,我正试图避免这种功能。
答案 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