2012-02-23 2 views
2

존재하지 않는 필드로 기존 연락처를 업데이트하려고하면 문제가 있습니다. 예 : 이름 및 전자 메일 주소 필드가 포함 된 새 연락처를 만들었습니다. 액션을 생성하는 동안 비어 있지 않은 필드에 대해서만 ContentProviderOperation.newInsert (ContactsContract.Data.CONTENT_URI)를 사용합니다. 연락처를 작성하는 동안 전화 필드를 삽입새 필드로 연락처를 업데이트 할 수 없습니다.

코드 (잘 작동)에서

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()); 
} 

:

그래서
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()); 
    } 
} 

가, 지금은 업데이트 프로세스를 실행하고 내 연락처에 전화 번호를 추가하려고 연락처 작성 중에 전화 필드가 삽입 된 경우 업데이트가 제대로 작동합니다. 휴대 전화가 삽입되지 않은 경우 업데이트는 아무 작업도 수행하지 않습니다. 필드는 업데이트되지 않습니다. LogCat의 경고도 오류도 없습니다.

연락처 작성시 빈 필드를 작성하고 싶지 않은 이유는 빈 필드로 인해 com.android.contacts.list.ContactListItemView에서 널 포인터 예외로 연락처 탭으로 전환 할 때 삼성 Nexus 장치에서 전화 애플리케이션이 충돌합니다. .onMeasure (ContactListItemView.java:350).

그래서, 내 질문은 : 은 업데이트 과정에서 존재하지 않을 경우 새 필드를 삽입하는 (그리고 그것을 어떻게 감지) 또는 존재하는 경우 필드를 삭제하고 새로운 갱신 값이 비어 있습니까? 필드가 비어있는 경우 Nexus 휴대 전화 앱의 충돌을 피할 수있는 또 다른 해결책이 있습니까?

P. , 경우 경우 새 값이 빈; 발견되지 않는 경우는, 경우에 생성 - (이 잘 업데이트 작업을 수행합니다

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

좋아, 내가 수정을 발견 받고, 이미 생성 접촉시 newInsert를 실행하려고 필드가 있으면 제거하고 업데이트하면됩니다.)

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()); 
    } 
} 
관련 문제