2011-09-29 90 views
7

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

我可能在文档(和谷歌)中缺少一些东西,所以如果任何人都可以指向我一个简单的方式来运行带有CursorLoader类的原始查询,我将不胜感激。否则,我将不得不用必要的功能创建我自己的CursorLoader类,这是我试图避免的。

回答

8

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

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

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

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

+0

这将是一个开始:http://stackoverflow.com/questions/7182485/usage-cursorloader-without-contentprovider –

+0

我不知道这是完全真实的,可能造成我2几天的红鲱鱼。我在我的SQLiteOpenHelper中有一个rawQuery,我有我所有的实际查询。我从一个由cursorloader启动的内容提供者调用它,它似乎工作正常。 – kpierce8

+0

@ kpierce8:OP正在尝试将“原始查询”传递给“CursorLoader”,这不是严格支持的。 OP没有讨论ContentProvider的*实现*,它是你使用SQLiteOpenHelper和rawQuery()的地方。现在,有人可能实现一个ContentProvider,其中一个“原始查询”被传入,比如说query()的第三个参数,而不是简单的WHERE子句(或者等价的)。而且,对于特定的'ContentProvider',您可以将“原始查询”传递给'CursorLoader'。但是,这不是一个典型的方法。 – CommonsWare

7

原始查询不直接支持,但你可以做一个肮脏的黑客:像

@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); 
    } 
[...] 
} 
+0

我如何编写内容Uri如果我需要访问两个表来回原始查询uri。 –

1

**对于自定义搜索使用内容提供商从您的代码调用 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;