将新联系人插入Android联系人时,电话号码附加到现有联系人
我正在开发sync adapter
至sync contacts
,电话号码为ERP system
。 一切工作正常在模拟器上,但在手机上,我得到了新的电话号码附加到已有的“手工”创建的联系人。将新联系人插入Android联系人时,电话号码附加到现有联系人
int rawContactInsertIndex =0;
// Add new items http://techblogon.com/insert-new-contact-in-android-code-example/
for (RestAPIContactParser.Entry e : entryMap.values()) {
rawContactInsertIndex = batch.size();
...
batch.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.SOURCE_ID, e.code)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, ACCOUNT_TYPE)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, ACCOUNT_NAME)
rawContactInsertIndex)
.build());
... batch.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, e.phone)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.build());
当我删除我的帐户联系人时,插入的电话号码也从现有联系人中删除。 我甚至在模拟器上创建了一个新的联系人,然后尝试同步,并且一切正常,新的电话号码未连接到旧的联系人。 任何想法?编辑: :它不清楚RawContacts表的数据库结构是什么。应像做
rawContactInsertIndex =max(ContactsContract.Data.RAW_CONTACT_ID)+1
,然后递增rawContactInsertIndex而不是rawContactInsertIndex = batch.size()?
这是Android的,每当有新RawContact
插入预期的行为,系统将尝试检查是否是新RawContact
是现有Contact
的副本,并尝试使用AggregationExceptions
加入新RawContact
到现有Contact
表。 它使用姓名,电话和电子邮件来寻求我们潜在的现有合并联系人。
如果你不想让你的新RawContact我合并到现有的联系人(虽然,你应该重新考虑这是你不想让你的用户抱怨重复的联系人),你可以添加一个TYPE_KEEP_SEPARATE
规则AggregationExceptions
,指定你的RawContact
不应该加入:
ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI)
.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_SEPARATE)
.withValue(AggregationExceptions.RAW_CONTACT_ID1, yourNewRawContact)
.withValue(AggregationExceptions.RAW_CONTACT_ID2, anExistingRawContact)
.build();
当我删除我的帐户中的联系人...
切勿删除Contacts
这是CREA因为它可能会删除与您的帐户无关的RawContacts
。只有删除您的RawContacts和相关的联系人将被自动删除,如果需要。
难道这样做
rawContactInsertIndex = MAX(ContactsContract.Data.RAW_CONTACT_ID)+1
没有! RawContact
ID是自动分配的,请勿自行设置。 你应该这样做:
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
而且在同一批次确保您applyBatch
各相关业务一起。
感谢解释AggregationExceptions。我多次删除了我的帐户rawcontacts,没有任何副作用,当我删除rawcontacts时,我总是指定我的帐户名称和类型作为查询参数。 –
是的,这很好,只需要小心删除'RawContacts'永远不要删除'联系人',因为您可能会删除其他帐户的数据。 – marmor
我已经手动删除了手机中的所有联系人,然后从备份中导入.vcf,然后安装了我的同步适配器,问题消失了。据我了解,我在联系人中有一些孤儿。 –