2015-10-15 31 views
0

我使用下面的代碼片段:FilterQueryProvider不工作

FilterQueryProvider provider = new FilterQueryProvider() { 
        @Override 
        public Cursor runQuery(CharSequence constraint) { 
         /* Uri uri = TextUtils.isEmpty(constraint) ? EmployeeContentProvider.URI_EMPLOYEES : 
           Uri.withAppendedPath(EmployeeContentProvider.URI_EMPLOYEES, constraint.toString()); */ 
         return getContentResolver().query(EmployeeContentProvider.URI_EMPLOYEES, Employee.FIELDS, Employee.COL_NAME + " IS ?", new String[]{constraint.toString()}, null); 

        } 
       }; 

在上面,如果我使用Uri.withAppendedPath並提供_id字段作爲搜索constriant,它工作正常。不過,我想根據名稱進行搜索。這裏不起作用。我的內容提供商如下:

@Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 

     Cursor result = null; 
     System.out.println("Selection: " + selection); 
     System.out.println("Selection args: " + Arrays.toString(selectionArgs)); 

     if (URI_EMPLOYEES.equals(uri)) { 
      result = DatabaseHandler 
        .getInstance(getContext()) 
        .getReadableDatabase() 
        .query(Employee.TABLE_NAME, Employee.FIELDS, selection, selectionArgs, null, null, Employee.COL_NAME, null); 

      result.setNotificationUri(getContext().getContentResolver(), URI_EMPLOYEES); 
     } else if (uri.toString().startsWith(EMPLOYEE_BASE)) { 

      final long id = Long.parseLong(uri.getLastPathSegment()); 
      result = DatabaseHandler 
        .getInstance(getContext()) 
        .getReadableDatabase() 
        .query(Employee.TABLE_NAME, Employee.FIELDS, 
          Employee.COL_ID + " IS ?", 
          new String[]{String.valueOf(id)}, null, null, 
          null, null); 
      result.setNotificationUri(getContext().getContentResolver(), URI_EMPLOYEES); 
     } else { 
      throw new UnsupportedOperationException("Not yet implemented"); 
     } 

     return result; 
    } 

我怎麼會錯過嗎?

+0

好吧,我想我將不得不使用類似的條款! – User3

+0

您還需要處理'runQuery'中的'TextUtils.isEmpty(constraint)== true',來自docs:''Contract:當約束爲空或空時,在任何過濾之前的原始結果必須是返回。「' – pskink

+0

喲隊友!我已經改變了這一切,感覺很好我有一個很好的名單和運行!禮貌你 – User3

回答

0

因此,這裏的解決方案,有趣這裏是如何,並優先於OR

 public void onLoadFinished(Loader<Cursor> loader, Cursor mCur) { 


      FilterQueryProvider provider = new FilterQueryProvider() { 
       @Override 
       public Cursor runQuery(CharSequence constraint) { 
        Uri uri = TextUtils.isEmpty(constraint) ? EmployeeContentProvider.URI_EMPLOYEES : 
          Uri.withAppendedPath(EmployeeContentProvider.URI_EMPLOYEES, constraint.toString()); 

        String where = Employee.COL_DEPARTMENT + " IS ?" + " AND (" + Employee.COL_NAME + " LIKE ? OR " + Employee.COL_EMPID + " LIKE ?)"; 
        String selectionArgs[] = new String[]{String.valueOf(department), String.valueOf("%" + constraint + "%"), String.valueOf("%" + constraint + "%")}; 
        return getContentResolver().query(uri, Employee.FIELDS, where, selectionArgs, null); 

       } 
      }; 

      adapter1 = new CursorAdapter(ListActivity.this, R.layout.details_list_row, mCur); 
      adapter1.setFilterQueryProvider(provider); 
      mRecyclerView.setAdapter(adapter1); 

     }