2017-08-09 231 views
0

我正在开发sync adaptersync contacts,电话号码为ERP system。 一切工作正常在模拟器上,但在手机上,我得到了新的电话号码附加到已有的“手工”创建的联系人。将新联系人插入Android联系人时,电话号码附加到现有联系人

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

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

回答

0

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

难道这样做

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

没有! RawContact ID是自动分配的,请勿自行设置。 你应该这样做:

.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 

而且在同一批次确保您applyBatch各相关业务一起。

+0

感谢解释AggregationExceptions。我多次删除了我的帐户rawcontacts,没有任何副作用,当我删除rawcontacts时,我总是指定我的帐户名称和类型作为查询参数。 –

+0

是的,这很好,只需要小心删除'RawContacts'永远不要删除'联系人',因为您可能会删除其他帐户的数据。 – marmor

相关问题