Reputation: 255
I am trying to write a search query using cursor. It always returns cursor as empty. This query is supposed to return list of items for the text i am searching(String[] selectionArgs = { inputText };). where the inputText is search term which i am searching.
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;
It returns following error.
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)
I am expecting some issue in the query.. Dont know what i have missed.
Cursor people = getContentResolver().query(uri, projection, selection, selectionArgs, null);
Upvotes: 0
Views: 1321
Reputation: 22306
If you want to do a search based on partial results (as in searching "He" will give results "Hello", "He-man", "Heavy", "Te He he". etc you should use LIKE instead of a = ? statement
ex.
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);
Like statements don't play nice with selectionArgs which is why I pass in null for them..
Additionally, you need to change your code flow. If your cursor doesn't contain entries, you are still trying to retrieve values from the cursor.. Try something like this..
while(people.moveToNext()) {
String id = people.getString(idIdx);
String name = people.getString(indexName);
String number = people.getString(indexNumber);
// Do work...
}
You can remove your if (!people.moveToFirst())
statement since it's effectively doing nothing but printing a log statement. The while statement will perform the same check and only assign data to the list if it exists
Upvotes: 1