【问题标题】:PhoneLookup.CONTENT_FILTER_URI returns twice the same contactPhoneLookup.CONTENT_FILTER_URI 返回两次相同的联系人
【发布时间】:2014-02-23 11:41:39
【问题描述】:

在下面的代码中,我正在尝试获取具有特定电话号码的所有联系人。

但是,我似乎总是不止一次地获得一些联系人 ID。 具体来说,我有 2 个具有相同电话号码的联系人,并且我有 3 个联系人 ID。其中一个两次(相同的ID)

有什么想法吗?

谢谢

Cursor contactLookupCursor =  
localContentResolver.query(
    Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(requestedPhone)), 
                    new String[] {PhoneLookup._ID}, 
                    null, 
                    null, 
                    null);

if (contactLookupCursor != null)
{
    System.out.println("contactLookupCursor.getCount = "+contactLookupCursor.getCount()); // here i get 3
    if(contactLookupCursor.moveToFirst())
    {
        do
        {
            int ColumnIndex = contactLookupCursor.getColumnIndex(PhoneLookup._ID);
            if(ColumnIndex >= 0)
            {
                String contactId = contactLookupCursor.getString(ColumnIndex);
                System.out.println("contactId="+contactId);// here i get 12 then 13 then 13 again
            }
        }
        while (contactLookupCursor.moveToNext());
    }
    contactLookupCursor.close();
}

【问题讨论】:

    标签: android contacts android-contacts


    【解决方案1】:

    如果您向PhoneLookup.CONTENT_FILTER_URI 提供一个非规范化电话号码,那么它将在数据记录表中在两个位置匹配的电话号码。

    1 match for number with column "number" in record.
    1 match for normalized_number with column "normalized_number" in record.
    

    如果您提供 number = "+49177123456"number == normalized_number

    这种情况下PhoneLookup.CONTENT_FILTER_URI 将仅在电话表的“normalized_number”列中搜索


    您也可以使用 CommonDataKinds.Phone 代替 PhoneLookup。

    这样无论提供的电话号码是否标准化,您都不会得到重复的结果:

    String number = "0177123456";
    Uri uri =     Uri.withAppendedPath(android.provider.ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI,Uri.encode(number));
    Cursor rcursor = getContentResolver().query(uri,
                                            new String[] { ContactsContract.CommonDataKinds.Phone.CONTACT_ID },
                                            null,null,null);
    

    我猜 PhoneLookup 的奇怪行为是一个错误。

    但是也许 PhoneLookup 比 CommonDataKinds.Phone 性能更好

    类概述:[...] 这个查询是高度优化的。 http://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html

    CommonDataKinds.Phone 没有这样的声明。

    【讨论】:

    • 我总是提供一个非规范化的号码(即只有你在本地时拨打的号码)并且没有前导零。所以你可以想象我要查的号码是不完整的。但是,PhoneLookup.CONTENT_FILTER_URI 仍然可以找到正确的联系人。是因为查询结果是LIKE %number% 吗?
    • 我尝试从电话号码右侧删除数字,然后PhoneLookup.CONTENT_FILTER_URI 不再找到匹配项。似乎基础查询是LIKE %number,因为我可以从左边丢失几位数字,它仍然匹配。
    • CommonDataKinds.Phone 导致 E/execption: Invalid column number
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2016-06-29
    • 2016-01-18
    • 1970-01-01
    • 2014-08-19
    • 2019-08-10
    相关资源
    最近更新 更多