当联系人没有时用 ContactsContract 更新电子邮件

Update an email with ContactsContract when the contact doesn't have

我想更新联系人的邮件地址,它似乎有效,但如果联系人没有邮件地址,它不起作用,我有这个错误:

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

当联系人没有邮件地址时,也许我必须插入而不是更新,你怎么看?

编辑:

我试过了,但它不起作用...也许我没有使用插入做出正确的选择:

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

我找到了解决方案,我必须使用 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;
    }