2012-02-23 4 views
2

У меня возникла проблема при попытке обновить существующий контакт с полем, которого не существует. Пример: Я успешно создаю новый контакт, который содержит поля имени и адреса электронной почты. Во время действия create я использую 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 нет.

Причина, по которой я не хочу создавать пустые поля при создании контактов, из-за пустых полей сбой Телефонное приложение в устройстве Samsung 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()); 
    } 
} 
Смежные вопросы