【问题标题】:phone number attaches to the existing contact when inserting new contact into android contacts将新联系人插入 android 联系人时,电话号码附加到现有联系人
【发布时间】:2017-08-09 10:00:17
【问题描述】:

我正在用ERP system 在电话中开发sync adaptersync 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()?

【问题讨论】:

  • 我已经手动删除了手机中的所有联系人,然后从备份中导入了.vcf,然后安装了我的同步适配器,问题就消失了。据我了解,我的联系人中有一些孤儿。

标签: android insert contactscontract


【解决方案1】:

这是 Android 中的预期行为,每当插入新的RawContact 时,系统将尝试检查新的RawContact 是否与现有的Contact 重复,并尝试加入新的RawContact使用AggregationExceptions 表进入现有的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,因为它可能会删除与您的帐户无关的RawContacts。仅删除您的 RawContacts,如果需要,相关联系人将被自动删除。

应该做类似的事情

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

不! RawContact ID 是自动分配的,不要自己设置。 你应该这样做:

.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

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

【讨论】:

  • 感谢您解释 AggregationExceptions。我多次删除我的帐户 rawcontacts,没有任何副作用,我在删除 rawcontacts 时总是指定我的帐户名称和类型作为查询参数。
  • 是的,很好,请注意只删除RawContacts,切勿删除Contacts,因为您可能会删除其他帐户的数据。
猜你喜欢
  • 1970-01-01
  • 2014-03-30
  • 2012-06-17
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 2018-01-26
  • 2018-05-27
  • 2014-10-05
相关资源
最近更新 更多