2017-12-06 10 views
0

연락처의 메일 주소를 업데이트하고 싶습니다. 작동하지 않는 것 같지만 메일 주소가 작동하지 않아이 오류가 있습니다.연락처가없는 경우 ContactsContract로 이메일 업데이트

public static boolean updateMail(Context context, String id, String email){ 
     ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
     ArrayList<ContentProviderOperation> ops = new ArrayList<>(); 

     builder.withSelection(ContactsContract.Data.CONTACT_ID + "=? " + "AND " 
         + ContactsContract.CommonDataKinds.Organization.TYPE + "=?" 
       , new String[]{id, 
         String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_HOME)}); 
     builder.withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email); 
     ops.add(builder.build()); 

     return (applyBatch(context, ops)); 
    } 

어쩌면 내가 삽입하지 연락처가 메일 주소가없는 업데이 트를 확인해야합니다, 당신은 어떻게 생각하십니까 :

################################################################# 
W/System.err: Error Code : 0 (SQLITE_OK) 
W/System.err: Caused By : unknown error (code 0): Unable to convert BLOB to string 
################################################################# 

이 제 기능 updateMail()입니까?

편집 :

나는이 시도하지만 어쩌면 내가 삽입하여 올바른 선택을하지 않습니다 ... 작동하지 않습니다 :

public static boolean updateMail(Context context, String id, String email){ 
     ContentProviderOperation.Builder builder; 
     ArrayList<ContentProviderOperation> ops = new ArrayList<>(); 

     if (getMailById(context, id).isEmpty()){ 

      builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 

      builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, Integer.valueOf(id)); 
      builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); 
      builder.withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email); 
      builder.withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_HOME); 
      ops.add(builder.build()); 

     } else { 

      builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 

      builder.withSelection(ContactsContract.Data.CONTACT_ID + "=? " + "AND " 
          + ContactsContract.CommonDataKinds.Organization.TYPE + "=?" 
        , new String[]{id, 
          String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_HOME)}); 
      builder.withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email); 
      ops.add(builder.build()); 

     } 

     return (applyBatch(context, ops)); 
    } 
+0

* 연락처에 메일 주소가 없을 때 업데이트가 아닌 삽입을해야 할 수도 있습니다. * - 예, 값이 먼저 있는지 확인한 다음, '삽입'을 사용하는 것이 좋습니다. 존재하지 않습니다. – notyou

+0

감사하지만 여전히 작동하지 않습니다. 내 질문을 편집합니다. –

답변

0

나는 해결책을 찾았을, 나는에있다 ContactsContract.Data.RAW_CONTACT_ID 사용

public static boolean updateMail(Context context, String id, String email){ 
     ContentProviderOperation.Builder builder; 
     ArrayList<ContentProviderOperation> ops = new ArrayList<>(); 

     if (getMailById(context, id).isEmpty()){ 
      builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
      builder.withValue(ContactsContract.Data.RAW_CONTACT_ID, getRawId(context, Long.parseLong(id))); 
      builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); 
      builder.withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email); 
      ops.add(builder.build()); 
     } else { 
      builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 

      builder.withSelection(ContactsContract.Data.CONTACT_ID + "=? " + "AND " 
          + ContactsContract.CommonDataKinds.Organization.TYPE + "=?" 
        , new String[]{id, 
          String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_HOME)}); 
      builder.withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email); 
      ops.add(builder.build()); 

     } 

     return (applyBatch(context, ops)); 
    } 

그리고 getRawId() 방법 :

private static long getRawId(Context context, long contactId) { 
     String selection = ContactsContract.RawContacts.CONTACT_ID + "='" + contactId + "'"; 
     try (Cursor cur = context.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, new String[]{ContactsContract.RawContacts._ID}, selection, null, null)) { 
      assert cur != null; 
      if (cur.moveToNext()) { return cur.getLong(0);} 
     } 
     return 0; 
    }