2012-05-14 5 views
0

У меня проблема, когда при выполнении моего запроса с предложением WHERE он не возвращает никаких результатов, но если я оставлю WHERE равным нулю, он будет выполняться через все мои записи и найти совпадение. Может ли кто-нибудь сказать мне, что не так с моим запросом?SQLite Android-запрос не возвращает результатов, где

в моем коде позволяет сказать, что contactURI равно «содержания: //com.android.contacts/contacts/lookup/953i7d73a639091bc5b6/164» и contactUriId равно «164»

   // Put data in the contactURI 
       contactURI = data.getData(); 

       // get the contact id from the URI 
       contactUriId = contactURI.getLastPathSegment(); 

       //TEST TODO Fix URI Issue 
       String [] PROJECTION = new String [] { Data.CONTACT_ID, Data.LOOKUP_KEY }; 

       Cursor cursor = this.managedQuery(Data.CONTENT_URI, PROJECTION, Data.CONTACT_ID + "=?" + " AND " 
         + Data.MIMETYPE + "='*'", 
       new String[] { String.valueOf(contactUriId) }, null); 

       Log.e(DEBUG_TAG, contactUriId+"-164-"); 
       for(cursor.moveToFirst(); cursor.moveToNext(); cursor.isAfterLast()) { 
        Log.v(DEBUG_TAG, "lookupKey for contact: " + cursor.getString(1) + " is: -" + cursor.getString(0) + "-"); 
        if(cursor.getString(0).equals("164")){ 
         Log.e(DEBUG_TAG, "WE HAVE A MATCH"); 
        } 
       } 

Это мой журнал ...

05-14 19:08:40.764: D/OpenGLRenderer(21559): Flushing caches (mode 0) 
05-14 19:08:46.944: E/MyDebug(22269): 164-164- 

ответ

4

проблема с этим:

Data.MIMETYPE + "='*'" 

что ищет MIMETYPE s буквально назван *. Если вы хотите выбрать все MIMETYPE s, ничего не делайте. Запрос возвращает все эти строки по умолчанию.

Кроме того, этот цикл, кажется, выполнить, но это не совсем верно:

for(cursor.moveToFirst(); cursor.moveToNext(); cursor.isAfterLast()) { 

С cursorне имеет был переход от индекса -1. Это будет безопасно начать с самим началом и не перебирать до последней строки:

while(cursor.moveToNext()) { 

Если есть переехал cursor и хочет, чтобы начать с начала снова вы можете использовать:

for(cursor.moveToFirst(); cursor.moveToNext();) { 

подробного объяснение Почему:cursor.isAfterLast() не перемещает курсор, он просто проверяет, по-прежнему ли курсор ссылается на действительные данные. cursor.moveToNext() перемещает курсор в следующую строку и возвращает true, если курсор все еще находится в границах. (Иными словами, если cursor.isAfterLast() - true, то cursor.moveToNext() возвращает false.)

+0

Блестящий! Это исправило мою проблему! Большое спасибо Сэму! Я проголосую, но мне не хватает репутации. – BinaryNexus

Смежные вопросы