将新联系人插入 Android 联系人时,电话号码会附加到现有联系人



我正在开发一种sync adapter,可以用ERP system在手机中sync contacts。 模拟器上一切正常,但在手机上,我将新电话号码附加到"手动"创建的现有联系人。

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 合并到现有联系人中(但是,您应该重新考虑这一点,因为您不希望您的用户抱怨重复的联系人(,您可以向AggregationExceptions添加TYPE_KEEP_SEPARATE规则,指定您的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,因为它可能会删除与您的帐户无关RawContacts。仅删除您的原始联系人,如果需要,相关联系人将自动删除。

应该做类似的事情

rawContactInsertIndex =max(ContactsContract.Data.RAW_CONTACT_ID(+1

不!RawContactID 是自动分配的,请勿自行设置。 你应该做:

.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

并确保在同一批次中applyBatch所有相关操作。

最新更新