0

我有一个问题,当我使用 WHERE 子句执行查询时,它不会返回任何结果,但如果我将 WHERE 保留为 null,它将执行我的所有记录并找到匹配项。谁能告诉我我的查询有什么问题?

在我的代码中可以说contactURI等于“content://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

1 回答 1

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()truecursor.moveToNext()返回false。)

于 2012-05-14T23:19:35.830 回答