2012-05-14 71 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