查询联系人的结构化名称将返回null

mit*_*nia 2 android

我有一个Android联系人列表,我正在尝试检索给定的名称,中间名和姓氏.我能够检索其他信息,包括电子邮件和电话号码,但当我查询内容解析器的联系人名称部分时,我总是得到空值(即使moveToNext()正在执行,这意味着从系统中检索到的记录).

相关代码:

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));
}
Run Code Online (Sandbox Code Playgroud)

执行此代码后,字符串为null但不会抛出异常.我手动检查了几个联系人,所有联系人都填写了给定的姓名,中间名和姓氏.

我在这做错了什么?

mit*_*nia 6

我发现我错过了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);
Run Code Online (Sandbox Code Playgroud)

现在它正在工作:)