2011-03-11 203 views
19

我有一个“转储”实用程序,我正在使用它来学习ContactsContract,因为我没有在文档中找到它。当我转储联系人时,它会统计表中的263条记录,但是,我的设备上的联系人应用程序列出了我有244(“显示244个联系人”)。联系人与原始联系人有什么区别?

我的Sprint LG的通讯录应用程序为我同步的每个帐户显示选项,并且已经进入并检查了所有这些帐户,因此不应该进行任何筛选。

,我使用的实用程序的主URI:(在上面的查询每个_ID)

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

跟:

   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代表接触,生 联系人和数据。
  • 每个表都包含一列(_ID),它是一个自动递增的主键
    键。
  • 数据表包含了诸如电话号码,邮箱ID,
    地址等
  • 的原始接触点产生的实际接触的所有联系信息。因此,我们 使用原始联系人,同时添加一个 联系人。
  • 用户不能在联系人表中添加任何数据。这个
    表中的数据由于
    聚合的联系人而在内部填充。

你的逻辑工作了联系人的一些 的原因是:_ID联系人, 生接触,直到有 正在 发生任何接触的聚集保持不变。假设你添加两个联系人 同名abc。在这里,_ID为 原料接触增量的两倍,而 _ID联系人增量只有一次因为这两个触点被合并,由于 联系人的聚集

+0

上次批准的编辑是不正确的。如果你阅读原文,你会看到缺少标点符号和3张表格的重点。然后,他/他把这个引用为“数据表”,联系人包含所有......“您修改了原作者的正确语句。 – mobibob 2013-06-22 18:06:18

回答

22

这种差异是由于RawContacts越来越合并Contacts由于聚集规则。

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

请在Contacts,RawContactsDatahere之间找到一些说明。 即使问题是不同的,你可能会得到ContactsRawContacts之间的差异。

+1

超级答案和+1。我认为这些信息非常重要,因此我将把这个答案中的六个子弹引用并转换为这个问答。 – mobibob 2011-03-11 17:44:08

3

这三张表通常以其合同类别的名称来引用。这些类定义了表格使用的内容URI,列名和列值的常量:

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

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

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

了解更多信息click

+0

假设我想获取应用程序用来打开聊天意图的id,比如viber,我该怎么做?例如,如果Viber有一个联系人X,它有一些ID Y,它用于打开与此联系人聊天的意图,使用:intent = new Intent(Intent.ACTION_VIEW,Uri.parse(“content:/ /com.android.contacts/data/"+id)); intent.setPackage( “com.viber.voip”); – 2016-03-14 11:53:46

+0

请参阅此链接http://stackoverflow.com/a/35453979/4395114 – 2016-03-14 12:17:21

+0

我无法找到所需的ID。你能帮忙吗?我在这里发布了一篇文章:http://stackoverflow.com/q/35972329/878126 – 2016-03-14 13:50:55