部分联系人在每次写入相同联系人后重复(Android 2.0+)

部分联系人在每次写入相同联系人后重复(Android 2.0+),android,Android,我在为Android 2.0或更高版本编写API联系人时遇到了这个问题。 每次我写的都是我的谷歌账户中已经存在的联系人 帐户我得到了部分联系信息,但是 其他人没有。例如,FN、N、ORG、TITLE等字段始终位于一个字段中 复印件,但电话、电子邮件、ADR都是额外添加的,所以在第二次写下我的相同联系人后 2复制相同的电话或电子邮件。如何强制API引擎不重复已存在的数据 代码: 我尝试添加:已禁用聚合模式上的聚合模式。 但这并没有改变什么 在这种情况下,我很乐意得到任何提示 BR,伪造的我认为,对

我在为Android 2.0或更高版本编写API联系人时遇到了这个问题。 每次我写的都是我的谷歌账户中已经存在的联系人 帐户我得到了部分联系信息,但是 其他人没有。例如,FN、N、ORG、TITLE等字段始终位于一个字段中 复印件,但电话、电子邮件、ADR都是额外添加的,所以在第二次写下我的相同联系人后 2复制相同的电话或电子邮件。如何强制API引擎不重复已存在的数据

代码:

我尝试添加:已禁用聚合模式上的聚合模式。 但这并没有改变什么

在这种情况下,我很乐意得到任何提示


BR,伪造的

我认为,对于现有联系人,您要么更新,要么删除该联系人的数据行,在执行插入之前,正如我从您的代码中理解的那样,您是在插入内容而不是更新。

是的,我使用插入操作来代替更新,但为什么只有一些字段是双重的、三重的?数据表与标准联系人字段分开。电话、电子邮件、生日都存储在单独的表格中。这就是为什么只有那些字段才会翻倍。谢谢你的帮助。我在newUpdate上更改了newInsert,它可以很好地用于已经存在的联系人,否则什么都不会写,电话簿是空的。聚合是如何工作的?我不想将每个联系人与新联系人进行比较。我认为聚合引擎应该自己做这件事——比较每个字段,并在需要时添加一些更改,但不要将更改增加一倍。我不想一个人做这件事。这似乎很复杂。我认为必须有另一种解决办法。我希望如此。我没有使用此生成器类与联系人提供商一起工作。我总是先尝试更新,然后检查返回计数,如果返回计数为零,我就插入。所以你可能也应该对你的更新做同样的事情,从ContentProviderResult中获取计数或uri,如果为零,则进行插入。我确实更新了。没有写任何联系人,这是正确的2。我确实插入了。3个触点已断开,正常3。我又更新了。在thas之后,我发现1名联系人更换为3名。进行了一些不同的聚合。ContentProviderResult[]结果的长度为6,我检查每个索引的uri和计数。每个uri都是空的,但count会显示不同的值,如18、24等,但从不显示0。隐马尔可夫模型。。我真的不知道现在怎么了。您认为先进行更新,然后进行插入是非常好的方法,但为什么现在它会将所有内容聚合到一个联系人中呢?
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
        ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName)                       
.build());

...
// adding phone number

ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
            builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0);
            builder.withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
            builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneValue);
            builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, phoneType); // work/home
            builder.withValue(ContactsContract.CommonDataKinds.Phone.LABEL, phoneLabel);

            ops.add(builder.build());

...


try {
            contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (Exception e) {
            //
}