带有rawQuery的CursorLoader

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

我可能在文档(和谷歌)中缺less一些东西,所以如果有人能指向我一个简单的方法来运行一个CursorLoader类的原始查询,我将不胜感激。 否则,我将不得不创build我自己的CursorLoader类,它具有必要的function,我试图避免。

Solutions Collecting From Web of "带有rawQuery的CursorLoader"

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

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

所以如果有人可以指向我一个简单的方法来运行一个CursorLoader类的原始查询,我将不胜感激。

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

原始查询不被直接支持,但你可以做一个肮脏的黑客攻击:从你的代码调用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); } [...] } 

**对于使用内容提供者的自定义search

更改光标加载器跟随(在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;