2014-10-09 49 views
1

我有一個Android聯繫人列表,我試圖檢索給定的名稱,中間名和姓氏。我能夠檢索包括電子郵件和電話號碼在內的其他信息,但是當我查詢聯繫人名稱部分的內容解析程序時,我總是得到空值(即使moveToNext()正在執行,也就是說從系統中檢索到一條記錄)。查詢聯繫人的結構化名稱返回null

相關代碼:

String id = "Some ID"; 

// Perform a query to retrieve the contact's name parts 
String[] nameProjection = new String[] { 
     ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, 
     ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, 
     ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME 
}; 
Cursor nameCursor = mContext.getContentResolver().query(
     ContactsContract.Data.CONTENT_URI, 
     nameProjection, 
     ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID 
       + "=?", new String[] { id }, null); 

// Retrieve the name parts 
String firstName = "", middleName = "", lastName = ""; 
if(nameCursor.moveToNext()) { 
    firstName = nameCursor.getString(nameCursor.getColumnIndex(
      ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); 
    middleName = nameCursor.getString(nameCursor.getColumnIndex(
      ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME)); 
    lastName = nameCursor.getString(nameCursor.getColumnIndex(
      ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); 
} 

這塊代碼執行後,字符串是空,但不拋出任何異常。我手動檢查了幾個聯繫人,他們都填有名字,中間名和姓氏。

我在這裏做錯了什麼?

回答

5

我發現我錯過了MIMETYPE條件,以便實際從包含名稱的聚合表中選擇行。

我改變了nameCursor到:

Cursor nameCursor = mContext.getContentResolver().query(
     ContactsContract.Data.CONTENT_URI, 
     nameProjection, 
     ContactsContract.Data.MIMETYPE + " = '" + 
     ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "' AND " + 
     ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID 
       + " = ?", new String[] { id }, null); 

而現在它的工作:)