使用ContentProviderOperation更新和插入联系人

时间:2010-06-02 10:06:07

标签: android

我在Android 2.0+上遇到了更新/插入联系人的问题。 当电话簿为空时插入新联系人没有问题 当我第二次这样做时,一些像TEL,EMAIL这样的文件被加倍并绊倒等。 但N,FN,ORG都可以(一份)。

在得到其他成员这个论坛的建议后,我首先更新了一个联系人,然后ContentProviderResult []返回了uri的null然后我做了一个插入动作,它去了 好的,但之后我做了一个更新,所有的联系人都聚合成一个 - 我有一个联系人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());
  }

此解决方案有什么问题?工作聚合引擎如何?

我很乐意帮忙。

虚假

3 个答案:

答案 0 :(得分:1)

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

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:绑定或列索引   范围

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

希望这可以提供一些线索。

答案 1 :(得分:1)

如果要进行更新,则必须为每个ContentProviderOperation提供where子句,请参阅herehere

答案 2 :(得分:0)

您正在重新定义构建器而不将其添加到ops中,因此永远不会为名称发送数据,这解释了为什么您的聚合非常奇怪。

// 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());