我正在开发一种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
不!RawContact
ID 是自动分配的,请勿自行设置。 你应该做:
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
并确保在同一批次中applyBatch
所有相关操作。