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

时间:2017-08-09 10:00:17

标签: android insert contactscontract

我正在手机中使用sync adapter开发sync contactsERP 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()?

1 个答案:

答案 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}}所有相关操作。