联系人与原始联系人有什么区别?

mob*_*bob 21 android contacts contactscontract rawcontacts

我有一个"转储"实用程序,我用它来研究ContactsContract,因为我没有在文档中得到它.当我转储联系人时,它会计算表中的263条记录,但是,我的设备上的联系人应用程序列出了我有244条("显示244个联系人".)

有人可以解释这种差异吗?

我的Sprint LG的联系人应用程序为我同步的每个帐户都有显示选项,我已经进入并检查了所有帐户,因此不应该进行任何过滤.

我在该实用程序中使用的主要URI是:

    Uri uriRawContacts = ContactsContract.RawContacts.CONTENT_URI;
    String[] projection = new String [] {
            ContactsContract.RawContactsEntity._ID,
            ContactsContract.RawContactsEntity.CONTACT_ID,
            ContactsContract.RawContactsEntity.DELETED,
            ContactsContract.RawContactsEntity.AGGREGATION_MODE,
    };
    Cursor cursorRaw = cr.query(uriRawContacts, projection, null, null, null);
    DumpCursor.dumpAnyCursor(getApplicationContext(), "RawContacts", cr, cursorRaw, ",");
Run Code Online (Sandbox Code Playgroud)

接下来是(对于上面的查询中的每个_ID):

                long rawContactId = Long.parseLong(anyCursor.getString(anyCursor.getColumnIndex(RawContacts.CONTACT_ID)));

                Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
                 Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY);

                 Log.d(TAG, "rawContactUri: " + rawContactUri.toString());
                 Log.d(TAG, "entityUri: " + entityUri.toString());

                 Cursor c = cr.query(entityUri, new String[] { RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1 }, null, null, null);
Run Code Online (Sandbox Code Playgroud)

然后我遍历第一个查询,显示我的投影中的所有列,然后,使用第一个查询循环中的_ID字段,我发出第二个查询并转储其所有列.

为方便起见,答案中的子弹转换到此处: 有关详细说明,请参阅参考.更具体地说,建议您阅读有关聚合规则的内容. 参考:点击此处查看随后的原始引用文本

  • 联系人数据库分为3个表联系人,原始联系人和数据.
  • 每个表都包含列(_ID),它是一个自动递增的主
    键.
  • 数据表包含所有联系信息,如电话号码,邮件ID,
    地址等.
  • 原始联系人指向创建的实际联系人.因此,我们在添加联系人时使用原始联系人.
  • 用户无法在联系人表中添加任何数据.
    由于
    联系人的聚合,此表中的数据在内部填充.

您的逻辑适用于某些联系人的原因是:联系人的_ID,原始联系人保持不变,直到发生任何联系人聚合.假设你添加了两个同名abc的联系人.此处原始联系人的_ID增加两次,而联系人的_ID仅增加一次,因为这两个联系人由于联系人的聚合而合并

Man*_*hot 24

这种差异是由于聚合规则导致RawContacts合并Contacts.

RawContacts在列表显示"联系人"时添加联系人.因此计数差异.

请找之间的一些介绍Contacts,RawContactsData 在这里.这些问题即使是一个不同的你也许能够得到之间的区别ContactsRawContacts.


Man*_*hir 5

这三个表通常由其合同类的名称引用.这些类定义了表使用的内容URI,列名和列值的常量:

ContactsContract.Contacts table: - 基于原始联系行的聚合表示不同人的行.

ContactsContract.RawContacts table: - 包含特定于用户帐户和类型的人员数据摘要的行.

ContactsContract.Data 表: - 包含原始联系人详细信息的行,例如电子邮件地址或电话号码.

更多信息请点击