我有一个 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));
}
这段代码执行后,字符串为null,但没有抛出异常。我手动检查了几个联系人,他们都填写了名字、中间名和姓氏。
我在这里做错了什么?
最佳答案
我发现我缺少 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);
现在它开始工作了:)
关于android - 查询联系人的结构化名称返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26286962/