2012-12-12 52 views
0

我正在尝试使用光标编写搜索查询。它总是将光标返回为空。 这个查询应该返回我正在搜索的文本的项目列表(String [] selectionArgs = {inputText};)。 其中inputText是我正在搜索的搜索词。实现搜索查询时,光标始终返回为空

 Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
     String[] projection = new String[] {ContactsContract.Contacts._ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
       ContactsContract.CommonDataKinds.Phone.NUMBER}; 
     String selection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " = ? "; 
     String[] selectionArgs = { inputText }; 

     // Expecting problem in the query. 
     Cursor people = getContentResolver().query(uri, projection, selection, selectionArgs, null); 

     int indexName = people.getColumnIndex(StructuredName.DISPLAY_NAME); 
     int indexNumber = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); 
     int idIdx = people.getColumnIndexOrThrow(PhoneLookup._ID); 

     if(!people.moveToFirst()) 
     { 
      Log.w("No Cursor.., ","No cursor.., Cursor is empty.."); 
     } 

     do { 
      String id = people.getString(idIdx); 
      String name = people.getString(indexName); 
      String number = people.getString(indexNumber); 
      // Do work... 
     } while (people.moveToNext()); 

     return people; 

它返回以下错误。

W/No Cursor.., (1303): No cursor.., Cursor is empty.. 

W/Filter (1303): An exception occured during performFiltering()! 
W/Filter (1303): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
W/Filter (1303):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580) 
W/Filter (1303):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214) 
W/Filter (1303):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41) 
W/Filter (1303):  at android.database.CursorWrapper.getString(CursorWrapper.java:135) 
W/Filter (1303):  at rebornlabs.sms2india.sms.app.ContactActivity.getSearchedContacts(ContactActivity.java:179) 
W/Filter (1303):  at rebornlabs.sms2india.sms.app.ContactActivity$3.runQuery(ContactActivity.java:102) 
W/Filter (1303):  at android.widget.CursorAdapter.runQueryOnBackgroundThread(CursorAdapter.java:309) 
W/Filter (1303):  at android.widget.CursorFilter.performFiltering(CursorFilter.java:49) 
W/Filter (1303):  at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234) 
W/Filter (1303):  at android.os.Handler.dispatchMessage(Handler.java:99) 
W/Filter (1303):  at android.os.Looper.loop(Looper.java:123) 
W/Filter (1303):  at android.os.HandlerThread.run(HandlerThread.java:60) 

我期待在查询中出现一些问题..不知道我错过了什么。

Cursor people = getContentResolver().query(uri, projection, selection, selectionArgs, null); 
+2

这只是表示您的联系人中没有与“inputText”匹配的_exact_匹配项。 – Sam

回答

1

如果你想要做的基于部分结果的搜索(如搜索“他”会给结果“你好”,“男子汉”,“重”,“特他自己”。等你应使用代替LIKE =?语句

前。

String[] projection = new String[] { 
    ContactsContract.Contacts._ID, 
    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
    ContactsContract.CommonDataKinds.Phone.NUMBER 
}; 
String selection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " like '%" + inputText + "%'"; 

Cursor people = getContentResolver().query(uri, projection, selection, null, null); 

像语句不玩好与selectionArgs两个这就是为什么我通过在空为他们..

此外,您需要改变你的代码流。如果你的cu rsor不包含条目,你还在试图检索光标值..尝试这样的事情..

while(people.moveToNext()) { 
     String id = people.getString(idIdx); 
     String name = people.getString(indexName); 
     String number = people.getString(indexNumber); 
     // Do work... 
    } 

您可以移除if (!people.moveToFirst())声明,因为它有效地做什么,但打印日志语句。 while语句将执行相同的检查,并且只将数据分配给列表(如果存在)

+0

但在应用查询后抛出错误。 – swastican

+0

@PrakashP什么是错误? – dymmeh

+0

感谢它现在工作正常 – swastican