2010-06-02 53 views
9

我遇到了在Android 2.0+上更新/插入联系人的问题。 当电话簿为空时插入新联系人没有任何问题,但当我做了第二次时,如 某些档案像电话,电子邮件被加倍并且被触发等01​​但是N,FN,ORG都可以(一个副本)。使用ContentProviderOperation更新并插入联系人

获取和其他成员的意见这个论坛上,我第一次更新的联系人,然后ContentProviderResult []返回URI与空然后我做插入的动作,它出了 确定,但在那之后我做了更新和所有联系人进行汇总之后合并为一个 - 我有1个联系人insted 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()); 
    } 

什么是错的这个解决方案?工作聚合引擎如何工作?

我很乐意为您提供帮助。

虚假

回答

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

我认为必须有一个选择更新contact.So的withSelection重要的是要告诉ContentResolver的这联系更新。

希望这可以给一些线索。

+4

withSelection需要用'?'表示的参数对于字符串[]
即.withSelection(ContractsContract.Contacts._ID +“=?”,new String [] {“5”})
如果您没有任何'?'那里没有将String []值绑定到... – 2012-10-03 20:45:01

+0

@wiseideal感谢指向正确方向的指针。 withSelection肯定是我的问题。 – Bwire 2014-06-16 14:11:15

0

您正在重新定义构建器而不将其添加到操作系统中,因此数据永远不会发送给名称,这就解释了为什么您的聚合过程如此恶劣。

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

你必须为每个ContentProviderOperation where子句中,如果你想要做一个更新见herehere

相关问题