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

时间:2011-03-11 04:52:55

标签: 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, ",");

后跟(对于上述查询中的每个_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字段,发出第二个查询并转储其所有列。

为方便起见,答案中的项目符号转换为 有关详细说明,请参阅参考资料。更具体地说,建议您阅读有关聚合规则的内容。 参考:Click here for the original cited text that follows

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

你的逻辑为某些人工作的原因   联系人是:_ID代表联系人,   原始联系人一直保持不变   是任何联系人聚合   地点。让我们说你添加两个联系人   同名abc。这里是_ID   原始联系人增加两次   联系人的_ID仅在这两个联系人合并到期时递增一次   联系人聚合

2 个答案:

答案 0 :(得分:23)

这种差异是由于汇总规则将RawContacts合并到Contacts所致。

当列表显示“联系人”时,您将联系人添加到RawContacts。因此计数差异。

请在ContactsRawContactsData here之间找到一些说明。 即使问题不同,您也可以在ContactsRawContacts之间找到区别。

答案 1 :(得分:5)

这三个表通常用合同类的名称来表示。这些类定义了表使用的内容URI,列名和列值的常量:

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

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

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

了解更多信息click