在单个查询中获取联系人的详细信息

Posted

技术标签:

【中文标题】在单个查询中获取联系人的详细信息【英文标题】:Get details of contact in single query 【发布时间】:2012-06-17 08:53:21 【问题描述】:

大家好,我正在尝试使用 ContentResolver 从联系人数据库中获取联系人信息,这些字段想要获取姓名、号码、FORMATTED_ADDRESS、PHOTO 单个查询中的联系人详细信息。

所以基本上我需要对每个联系人进行 3 次查询才能获得这些 细节。

我想知道的是,有没有更简单有效的方法 达到什么这个。

但是使用下面的代码我得到了异常。

java.lang.IllegalArgumentException: Invalid column data1

任何机构都可以帮助我找到相同的解决方案吗?

Uri uri                = ContactsContract.Contacts.CONTENT_URI;
String[] projection    = new String[]  ContactsContract.Contacts._ID,
                                        ContactsContract.Contacts.DISPLAY_NAME,
                                        ContactsContract.CommonDataKinds.Phone.NUMBER,
                                        ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS,
                                        ContactsContract.CommonDataKinds.Photo.PHOTO;
String selection       = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'";
String[] selectionArgs = null;
String sortOrder       = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

Cursor contacts          = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);

【问题讨论】:

【参考方案1】:

问题可能出在selection。用我的方法代替你的方法。

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection = new String[]  ContactsContract.Contacts._ID,
                                        ContactsContract.Contacts.DISPLAY_NAME,
                                        ContactsContract.CommonDataKinds.Phone.NUMBER,
                                        ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS,
                                        ContactsContract.CommonDataKinds.Photo.PHOTO;
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER  + " = ?";
String[] selectionArgs =  String.valueOf(1) ; 
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

Cursor contacts = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);

您应该始终使用parametrized statements。你的方法很危险。而且你的 URI 是错误的。

【讨论】:

感谢您的回复,但在实现您的代码java.lang.IllegalArgumentException: Invalid column data1 后我得到了同样的异常 现在试试,你的 uri 有问题。我没有立即注意到它。 从查询中删除 selection 和 selectionArgs 后,它对我有用,但它不会给我 FORMATTED_ADDRESS 代替它它给 PHONE_NUMBER 不知道为什么。但是在调试时我发现它返回的列是“_id,display_name,data1,data1,data15”,它不会为它们提供原始名称。还有一个问题,它给游标带来了更少的否。记录,我在通讯录中有更多记录 是的,现在我正在尝试使用这个 URI ContactsContract.CommonDataKinds.Phone.CONTENT_URI 所以要获得 FORMATTED_ADRESS 你需要使用ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI【参考方案2】:

给你

替换

ContactsContract.Contacts.CONTENT_URI;

ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

【讨论】:

感谢 Vipul 的回复,我使用了您给定的 URI,在从查询中删除 selection 和 selectionArgs 后,它对我有用,但它不会给我 FORMATTED_ADDRESS 代替它它给 PHONE_NUMBER 不知道为什么。但是在调试时我发现它返回的列是“_id,display_name,data1,data1,data15”,它不会为它们提供原始名称。还有一个问题,它给游标带来了更少的否。记录,我在通讯录中有更多记录 尝试执行Cursor contacts = getContentResolver().query(uri, null, null,null,null); 什么是 URI? ContactsContract.CommonDataKinds.Phone.CONTENT_URI; ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 它返回了大约 72 列,但不会给出 FORMATTED_ADDRESS 和 PHOTO

以上是关于在单个查询中获取联系人的详细信息的主要内容,如果未能解决你的问题,请参考以下文章

如何从android中的单个查询中获取联系人的名字,姓氏,电子邮件ID

如何在 Android 中获取联系人的所有详细信息

访问 android 联系人所有详细信息的最佳方式

如何一次查询联系人的所有详细信息

如何从 Lync 联系人卡片中获取用户的电话号码或其他联系人详细信息?

如何通过 LookUpKey 获取联系电话号码?