【发布时间】:2015-08-04 17:14:04
【问题描述】:
我目前正在使用这个问题的答案:How to get all contacts first name, last name, email, phone number, etc without duplicates 来检索用户联系人列表,其中包含每个联系人的所有电话号码、名字、姓氏和照片 ID。
我对这个答案的疑问是它为每个想要的数据创建一个请求。它在我的应用程序上造成性能问题。我想从一个请求中检索所有这些信息,但是我很难理解 Android 的查询是如何管理的以及我要查找的存储数据在哪里。
我尝试过的示例(我做了很多测试但没有成功,以下是我尝试过的最后一个):
new CursorLoader(
this,
ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.Data.HAS_PHONE_NUMBER + "!=0 AND (" + ContactsContract.Data.MIMETYPE + "=?)",
new String[]{ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE},
ContactsContract.Data.CONTACT_ID)
;
以及我想检索的信息:
int firstNameCol = cursor.getColumnIndex(CommonDataKinds.StructuredName.GIVEN_NAME);
int lastNameCol = cursor.getColumnIndex(CommonDataKinds.StructuredName.FAMILY_NAME);
int photoIdCol = cursor.getColumnIndex(CommonDataKinds.StructuredName.PHOTO_ID);
int phoneCol = cursor.getColumnIndex(Phone.NUMBER);
该请求存在两个问题:
每个联系人我只有一个电话号码,但是我的一些联系人有多个号码,我想找回它们
我没有检索名字和姓氏(我得到一个奇怪的数字)
请注意,我不想检索 DISPLAY_NAME,我想要 given_name 和 family_name。另请注意,我希望每个联系人有一个结果,而不是每个电话号码有一个结果(即一个结果包含一对多的电话号码)
有什么想法可以在一个请求中完成吗?
编辑:尝试使用来自 @pskink 的另一段代码,但我收到“列 '_id' 不存在”错误
String[] projection = {
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
ContactsContract.CommonDataKinds.StructuredName.PHOTO_ID
};
String selection = ContactsContract.Data.MIMETYPE + " in (?, ?, ?, ?)";
String[] selectionArgs = {
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
ContactsContract.CommonDataKinds.StructuredName.PHOTO_ID
};
//String sortOrder = ContactsContract.Contacts.SORT_KEY_ALTERNATIVE;
//Uri uri = ContactsContract.CommonDataKinds.Contactables.CONTENT_URI;
Uri uri = ContactsContract.Data.CONTENT_URI;
// ok, let's work...
return new CursorLoader(
this, uri, projection, selection, selectionArgs, null
);
【问题讨论】:
-
查看 stackoverflow.com/a/26820544/2252830 并修改它以满足您的特定需求
-
这就是我不知道如何适应我的需要的东西。查看我的更新,我正在尝试,但出现“列 '_id' 不存在”错误。此外,您的解决方案正在做一些检查以检索对象中的电子邮件列表(如果(mimeType.equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)),我不能这样做,我真的需要在一行中检索所有电话号码,因为我在列表视图中使用了光标适配器,并且每个项目都必须链接到一个联系人,而不是一个电话号码。
-
对不起,我不知道你在说什么,你有没有尝试在 Activity.onCreate 中添加我的代码?
-
(对不起 - 你太快了,我正在更新我的答案,为什么你无法理解)不,我没有尝试添加你的代码,因为它不适合我的需要。网上有很多例子,每个例子都在工作,但我找不到适合我需要的东西(在一个请求中,作为一个快速提醒,我现在有一些工作但有请求很多,并且花费了太多时间)
-
是您制作了最终版本(顺便说一句,您也可以在此处发布答案);如果你愿意,你可以投票给我的原创作品