2017-12-06 16 views
0

連絡先のメールアドレスを更新したいと思うが、連絡先がメールアドレスを持っていない場合、連絡先に連絡先がないときにContactsContractで電子メールを更新する

################################################################# 
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 = 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)); 
    } 

は、たぶん私は連絡先がメールアドレスを持っていない場合、挿入ではなく、更新をしなければならない、あなたはどう思いますか?

EDIT:

たぶん私は、インサートを使用して、正しい選択をしない...私はこれを試してみたが、それは働いていない:

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; 
    } 
関連する問題