2012-05-14 73 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,請不要做任何事情。查詢默認返回所有這些行。

此外,這個循環似乎執行,但它並不完全正確:

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

太棒了!這解決了我的問題!非常感謝Sam!我會投票,但我沒有足夠的代表。 – BinaryNexus