【问题标题】:What is the difference in contacts versus raw-contacts?联系人与原始联系人有什么区别?
【发布时间】:2011-07-13 05:58:31
【问题描述】:

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

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

你的逻辑对某些人有效的原因 联系人是:联系人的_ID, 原始联系人保持不变,直到那里 是否有任何联系人聚合 地方。假设您添加了两个联系人 同名 abc。这里的_ID 原始联系人增加两次,而 联系人的 _ID 只会增加一次,因为这两个联系人会合并 到联系人的聚合

【问题讨论】:

  • 最后批准的编辑不正确。如果您阅读原文,您会看到缺少的标点符号和 3 个表格的重点。然后他/她将其引用为“数据表,'联系人'包含所有...”您已修改原作者的正确陈述。

标签: android contacts contactscontract rawcontacts


【解决方案1】:

这种差异是由于 RawContacts 由于聚合规则而合并到 Contacts 造成的。

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

请在ContactsRawContactsData here 之间找到一些描述。 即使问题是不同的问题,您也可能能够区分ContactsRawContacts

【讨论】:

  • 超级答案和+1。我认为该信息非常重要,我将参考并将该答案中的六个项目符号转换为此问答。
【解决方案2】:

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

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

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

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

更多信息click

【讨论】:

  • 假设我想获取应用程序用来打开聊天意图的 id,例如 viber,我该怎么做?例如,如果 Viber 有一个联系人 X,它有一个 Y 的 ID,用于打开与此联系人聊天的意图,使用:intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content:/ /com.android.contacts/data/"+id)); intent.setPackage("com.viber.voip");
  • 我找不到所需的 ID。你能帮忙吗?我在这里发了一个帖子:stackoverflow.com/q/35972329/878126
猜你喜欢
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 2011-10-09
  • 2018-06-24
  • 2012-05-21
  • 1970-01-01
相关资源
最近更新 更多