【问题标题】: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);

【问题讨论】:

    标签: android android-contacts android-contentprovider


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    相关资源
    最近更新 更多