我有一个问题,当我用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-
答案 0 :(得分:4)
问题在于:
Data.MIMETYPE + "='*'"
即搜索名为MIMETYPE
的{{1}}。如果要选择所有*
,请不要执行任何操作。查询默认返回所有这些行。
此外,此循环似乎已执行,但不太正确:
MIMETYPE
由于for(cursor.moveToFirst(); cursor.moveToNext(); cursor.isAfterLast()) {
尚未从索引-1移动。这将安全地从头开始并迭代直到最后一行:
cursor
如果您 移动while(cursor.moveToNext()) {
并想再次从头开始,您可以使用:
cursor
详细说明原因: for(cursor.moveToFirst(); cursor.moveToNext(); ) {
不移动光标,只是检查光标是否仍然指向有效数据。如果光标仍然在边界内,cursor.isAfterLast()
将光标移动到下一行,返回cursor.moveToNext()
。 (换句话说,如果true
为cursor.isAfterLast()
,则true
会返回cursor.moveToNext()
。)