2010-06-02 48 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

相關問題