2011-09-29 32 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;