【发布时间】:2012-01-15 22:38:03
【问题描述】:
我目前正在使用 Android 联系人内容提供商,目前可以使用以下代码毫无问题地访问联系人的完整显示名称:
String[] PROJECTION = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.HAS_PHONE_NUMBER,
};
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
String SELECTION = "LOWER(" + ContactsContract.Contacts.DISPLAY_NAME + ")"
+ " LIKE '" + constraint + "%' " + "and " +
ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'";
Cursor cur = managedQuery(ContactsContract.Contacts.CONTENT_URI,
PROJECTION, SELECTION, null, sortOrder);
但是我希望能够分别获取联系人的名字和姓氏,我尝试使用 StructuredName 来尝试获取此信息,但似乎无法正常工作。
谁能指出我正确的方向,如何正确使用 StructuredName 将名称拆分为 First 和 Last?
更新:
按照 hovanessyan 的建议,我尝试了以下方法:
String[] PROJECTION = new String[] {
ContactsContract.Data._ID,
ContactsContract.Data.DISPLAY_NAME,
ContactsContract.Data.HAS_PHONE_NUMBER,
};
String SELECTION = ContactsContract.CommonDataKinds.StructuredName.IN_VISIBLE_GROUP + " = '1'";
String sortOrder = ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
Cursor cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null, sortOrder);
int indexGivenName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
int indexFamilyName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME);
int indexDisplayName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME);
while (cursor.moveToNext()) {
String given = cursor.getString(indexGivenName);
String family = cursor.getString(indexFamilyName);
String display = cursor.getString(indexDisplayName);
Log.e("XXX", "Name: | " + given + " | " + family + " | " + display);
}
但是使用 PROJECTION 会导致崩溃,如下所示:
12-08 16:52:01.575: E/AndroidRuntime(7912): Caused by: java.lang.IllegalArgumentException: Invalid column has_phone_number
如果我删除 PROJECTION,我会打印出所有结果,但其中很多包含 NULL。
例如:
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null
那么任何人都可以看到我做错了什么,因为我的 PROJECTION 不起作用?
进一步更新:
我已经解决了我的 PROJECTION 的问题,但现在我遇到了一个问题,即 DATA 内容提供者向我提供所有空数据并导致我的代码中出现空指针异常。
例如,来自 ContactsContract.Contacts 的游标计数返回 115,但使用 DATA 表使用相同的参数返回 464,这在我的应用程序中造成了巨大的问题。
有人知道为什么会这样吗?
【问题讨论】:
-
您还需要选择 minetype 和 lookup_key 并合并联系人,从 android 示例中检查 Contactables。
标签: android android-contacts android-cursor