2012-02-23 50 views
2

我嘗試更新現有聯繫人字段時不存在問題。 例如: 我成功創建了包含姓名和電子郵件地址字段的新聯繫人。在創建操作期間,我只對非空字段使用ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)。無法更新新字段的聯繫人

代碼爲聯繫人創建過程中插入手機領域(正常工作):

if (isNewContact){ 
    if (!phone.equals("")){ 
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
     .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, id) 
     .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
     .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone) 
     .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, type) 
     .build()); 
    } 
} 

所以,現在我嘗試運行更新過程,並追加到我的聯繫人的電話號碼:

if (isUpdateContact){ 
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) 
     .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " 
        + ContactsContract.CommonDataKinds.Phone.TYPE 
        + "=? AND " + ContactsContract.Data.MIMETYPE 
        + "=?", 
        new String[] {"" + id, "" + type, 
        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE }) 
     .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone) 
     .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, type) 
     .build()); 
} 

在如果在聯繫人創建過程中插入手機字段,則更新可以正常工作。如果手機沒有插入,那麼更新什麼都不做 - 該字段不會被更新。在LogCat中沒有警告既沒有錯誤。

我不想在聯繫人創建時創建空字段的原因是因爲空字段崩潰在三星Nexus設備中切換到聯繫人選項卡時出現空字段崩潰在com.android.contacts.list.ContactListItemView中使用空指針異常.onMeasure(ContactListItemView.java:350)。

所以,我的問題是: 如何在更新過程中插入一個新的領域,如果不存在(以及如何檢測它),或者如果存在刪除字段,但新的更新值是空的?有沒有可能,或者有另一種解決方案來避免Nexus手機應用程序崩潰,如果字段爲空?

P.S.試圖對已經創建的聯繫人期間運行newInsert,越來越:

mType: 1, mUri: content://com.android.contacts/data, mSelection: null, mExpectedCount: null, mYieldAllowed: false, mValues: data1= mimetype=vnd.android.cursor.item/phone_v2 data2=1, mValuesBackReferences: raw_contact_id=2962, mSelectionArgsBackReferences: null 
java.lang.ArrayIndexOutOfBoundsException: asked for back ref 2962 but there are only 1 back refs 
at android.content.ContentProviderOperation.backRefToValue(ContentProviderOperation.java:362) 

回答

1

好吧,我找到了修復: (這會做正確的更新操作 - 的情況下,如果沒有找到,創建;在情況下,如果新值空,只是刪除該字段;如果存在,則更新。)

if (isUpdateContact){ 
    ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) 
     .withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND " 
        + ContactsContract.CommonDataKinds.Phone.TYPE 
        + "=? AND " + ContactsContract.Data.MIMETYPE 
        + "=?", 
        new String[] {"" + id, "" + type, 
        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE }) 
     .build()); 
    if (!phone.equals("")){ 
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValue(ContactsContract.Data.RAW_CONTACT_ID, id) 
      .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone) 
      .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, type) 
      .build()); 
    } 
}