在单个查询中获取联系人的详细信息
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