使用ContentProviderOperation更新和插入联系人

Bog*_*gus 9 android

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

在获得该论坛的其他成员的建议之后,我首先更新了一个联系人,然后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());
  }
Run Code Online (Sandbox Code Playgroud)

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

我很乐意帮忙.

虚假

wis*_*eal 1

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

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

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

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

我认为必须有一个选择来更新联系人。因此 withSelection 非常重要,可以告诉 ContentResolver 要更新哪个联系人。

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

  • withSelection 需要用“?”表示的参数 对于 String[]&lt;br/&gt; 即 .withSelection(ContractsContract.Contacts._ID + " = ?", new String[] {"5"})&lt;br/&gt; 如果你没有任何 '?'没有任何东西可以将 String[] 值绑定到... (4认同)