Android Contacts._ID != Data.CONTACT_ID

Posted

技术标签:

【中文标题】Android Contacts._ID != Data.CONTACT_ID【英文标题】: 【发布时间】:2014-05-13 00:00:57 【问题描述】:

我正在对 CommonDataKinds.Phone.CONTENT_URI 运行查询,我得到了所有电话 ID 不为空的结果。

代码差不多是:

    String[] projection2 = new String[] 
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID,          
            ContactsContract.Contacts._ID,                              
            ContactsContract.Contacts.DISPLAY_NAME,             
        ;
    String where2 = ContactsContract.CommonDataKinds.Phone._ID + " != ''" ;


    Cursor phoneCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            projection2, where2, null, null);

然后我遍历每个游标结果并获得我想要的列。 代码是:

           if (phoneCursor.getCount() > 0) 
            while (phoneCursor.moveToNext()) 
                String contacts_id = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.Contacts._ID));
                String phone_id = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
                    Log.i("phonecursor", "contacts_id= "  + contacts_id + " phone_id " + phone_id 
                            +  "  contacts_name= "  + contacts_name + " phone_name= " + phone_name
                            + " Phone= " + phone  );

            
            phoneCursor.close();
        

我不明白为什么 Phone.CONTACT_ID 与同一行中相应的 Contacts._ID 不同...

两者不应该相同吗?有很多示例使用这些确切的列来运行查询。例如 here 和 here 如果您检查 Key 指针。

【问题讨论】:

【参考方案1】:

ContactsContract.Contacts._ID 返回一行的唯一 ID

this is very good example

【讨论】:

经过 24 小时的探索,我终于找到了联系人的实际存储方式以及我的一些查询是如何工作的,以及一些查询是如何不起作用的!谢谢!【参考方案2】:

ContactsContract.Contacts._ID 返回一行的唯一 ID。

现在输出将根据您查询的cursor ContactsContract.Contacts._ID 而有所不同。

如果您从 ContactsContract.Contacts.CONTENT_URI 查询 ContactsContract.Contacts._ID ,您将得到 ContactsContract.Contacts._IDContactsContract.CommonDataKinds.Phone.CONTACT_ID 相同。

但如果您从ContactsContract.CommonDataKinds.Phone.CONTENT_URI 查询ContactsContract.Contacts._ID,您将得到ContactsContract.Contacts._IDContactsContract.CommonDataKinds.Phone.CONTACT_ID 不同,因为每个电话条目ContactsContract.Contacts._ID 都会递增。

因此,如果您想要相同的 _ID 和 Phone._ID,请从 ContactsContract.Contacts.CONTENT_URI 而不是 ContactsContract.CommonDataKinds.Phone.CONTENT_URI 查询

【讨论】:

以上是关于Android Contacts._ID != Data.CONTACT_ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Contacts Android 中查找所有电话号码并为其添加前缀?

Telephony.Sms.Inbox.PERSON 使用已弃用的 Contacts.People._ID

Android使用READ_CONTACTS读取手机联系人

CursorLoader 选择

如何在 Android 中编辑现有联系人?

Android 联系人数据库介绍以及对联系人的基本操作