我正在手机中使用sync adapter
开发sync contacts
到ERP system
。
一切都在模拟器上工作正常,但在手机上我将新的电话号码附加到已经存在的联系人,这些联系人是手工制作的#34;
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()?
答案 0 :(得分:0)
这是Android中的预期行为,无论何时插入新的RawContact
,系统都会尝试检查新的Contact
是否与现有RawContact
重复,并尝试使用AggregationExceptions
表将新Contact
加入现有TYPE_KEEP_SEPARATE
。
它使用姓名,电话和电子邮件来寻找我们潜在的合并现有联系人。
如果您不希望我的新RawContact合并到现有的联系人中(但是,您应该重新考虑这是因为您不希望您的用户抱怨重复的联系人),您可以添加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
当我删除我的帐户联系人时...
永远不要删除作为帐户一部分创建的RawContacts
,因为它可能会删除与您的帐户无关的RawContact
。只有删除 RawContacts ,相关联系人才会在需要时自动删除。
应该做像
这样的事情rawContactInsertIndex = max(ContactsContract.Data.RAW_CONTACT_ID)+1
没有! .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
ID是自动分配的,请勿自行设置。
你应该这样做:
applyBatch
并确保您在同一批次中{{1}}所有相关操作。