【发布时间】: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