2016-11-18 84 views
0

我的应用程序允许编辑联系人。在这种情况下,我选择了仅存在于一个帐户中的联系人,并将其更改为将其与三个帐户相关联。但是,我结束了两个联系人,而不是一个,如下面的ContactsContract转储所示。为什么提供者不会聚合它们?为什么不将联系人汇总?

agg 1821, display "A Z1", key 770i236434918d3893ea.2709i79dde86f8c1565d3.2709i506dc01a0d43d677.2709i4707c358f8fb503 
    raw 1821, acct type com.google, acct name [email protected] 
    data 10338, display "A Z1" 
    data 10343, phone 123456, Pager 
    data 10349, phone 545, Fax Work 

agg 1861, display "A Z1", key 1780r1860-q29pq04pq5Bpq16p.2709r1861-q29pq04pq5Bpq16p 
    raw 1860, acct type com.fusionone.account, acct name Backup Assistant 
    data 10580, display "A Z1" 
    data 10582, phone 123456, Pager 
    data 10584, phone 545, Fax Work 

    raw 1861, acct type com.google, acct name [email protected] 
    data 10581, display "A Z1" 
    data 10583, phone 123456, Pager 
    data 10585, phone 545, Fax Work 

在此转储中,三层表示聚合联系人行,原始联系人行和联系人数据行。前导词旁边的数字(例如,agg 1821)是_ID列值。 “display”代表DISPLAY_NAME。

更具体地说,我从agg 1821开始,它来自account [email protected](模糊处理)。然后,我为两个其他帐户创建了两个新的原始联系人(1860和1861),使用与agg 1821相同的显示名称。您可以看到结果:两个新的原始联系人聚合在一起,但该对未汇总为原始(1821)联系。

回答

3

不要以为系统汇总类似的接触,如果你想RawContacts通过写AggregationExceptions加盟力聚集:

对于每一对,创建一个操作:

Builder builder = ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI); 
builder.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER); 
builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, raw1); 
builder.withValue(AggregationExceptions.RAW_CONTACT_ID2, raw2); 
ContentProviderOperation op = builder.build(); 

然后执行

ContentProviderResult[] res = resolver.applyBatch(ContactsContract.AUTHORITY, operationList); 

res将包含有关成功/ F信息:所有操作ArrayList所有的操作

+0

因为这种技术的作品,我会给你一个+1,而且是我正在使用的。但是,它没有回答这个问题。除非有人能够拿出一个好的理由,在我的例子中,聚合算法失败了,这似乎是很没用的。 –

+0

自动汇总决策代码相当复杂,它也可能使用联系人的创建日期来做出决定,所以当您同时创建两个相同的联系人时,它会立即汇总它们,而不是旧汇总。我有几天后发生聚合的情况,当时通过同步提供程序更新联系人。 – marmor

相关问题