22

我有一个用于研究 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, ",");

后跟(对于上述查询中的每个 _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);

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

为方便起见,此处转置了答案中的项目符号: 有关更详细的说明,请参阅参考资料。更具体地说,我们鼓励您阅读聚合规则。 参考:单击此处查看后面的原始引用文本

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

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

4

2 回答 2

24

这种差异是由于RawContacts聚合Contacts规则导致的。

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

Contacts请在,RawContactsData 这里找到一些描述。即使问题是不同的问题,您也可以得到 和 之间的Contacts区别RawContacts

于 2011-03-11T09:07:27.490 回答
5

这三个表通常由它们的合同类的名称来引用。这些类为表使用的内容 URI、列名和列值定义常量:

ContactsContract.Contacts表:- 代表不同人的行,基于原始联系人行的聚合。

ContactsContract.RawContacts表:- 包含个人数据摘要的行,特定于用户帐户和类型。

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

更多信息请点击

于 2016-02-15T10:42:11.587 回答