使用ContentProviderOperation来更新和插入联系人

我遇到了在Android 2.0+上更新/插入联系人的问题。 当电话簿为空时插入一个新的联系人没有问题,但是当我做了第二次像TEL,EMAIL等一些档案翻倍,跳闸等,但N,FN,ORG都可以(一个副本)。

在得到和其他成员这个论坛的build议之后,我更新了一个联系人,然后ContentProviderResult []返回了uri的null,然后我做了一个插入操作,并且确定了,但之后我做了一个更新,所有的联系人都汇总为一个 – 电话簿中存在1个联系人3。 这个被破坏了,接触场是随机的。

我设置了Google帐户。

码:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI) .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) .build()); // add name ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0); builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); builder.withValue(ContactsContract.CommonDataKinds.StructuredName.PHONETIC_FAMILY_NAME, name); // phones ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(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); builder.withValue(ContactsContract.CommonDataKinds.Phone.LABEL, phoneLabel); ops.add(builder.build()); // emails ... // orgs ... try { ContentProviderResult[] result = mContentResolver.applyBatch(ContactsContract.AUTHORITY, ops); } } catch (Exception e) { Log.e(LOG_TAG, "Exception while contact updating: " + e.getMessage()); } 

这个解决scheme有什么问题? 工作聚合引擎如何工作?

我会很高兴的帮助。

虚假

Related of "使用ContentProviderOperation来更新和插入联系人"

我遇到了同样的问题,我认为它应该以这种方式工作

 opt.add(ContentProviderOperation.newUpdate(ContactsContract.Contacts.CONTENT_URI) .withSelection(ContactsContract.Contacts._ID, new String[]{entity.getPeople()}) .withValue(ContactsContract.Contacts.DISPLAY_NAME, "daerba") .build() ); 

但它出错了,并报告这一点。

android.database.sqlite.SQLiteException:绑定或列索引超出范围

我认为必须有一个select来更新联系人。所以withSelection对于告诉ContentResolver更新哪个联系人非常重要。

希望这可以给一些线索。

如果您想进行更新,则必须为每个ContentProviderOperation提供一个where子句,请参阅此处和此处 。

您正在重新定义构build器而不将其添加到操作,因此数据永远不会被发送给名称,这就解释了为什么您的聚合是如此的奇怪。

 // add name ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); // phones ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 

也由于可读性,我更喜欢在处理小批量时使用以下格式。

 ArrayList<ContentProviderOperation> batchOp = new ArrayList<ContentProviderOperation>(); batchOp.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType).build());