2

Android で連絡先を編集する際に問題があります。で使用contentProviderOperationしてnewUpdateいますが、機能していません。フィールドにすでに何かがある場合にのみ機能します。フィールドに入力して消去し、保存して再度編集しようとすると、保存されていないことがわかり、例外が発生します。

編集する必要があるコードは次のとおりです。

        if (emailantigo.equals("") && !email.equals("")) {
debug("email " + email);
            debug("id " + contactId);
            ops.add(ContentProviderOperation
                    .newInsert(ContactsContract.Data.CONTENT_URI)
                    .withValue(ContactsContract.RawContacts.CONTACT_ID, contactId)
                    .withValue(ContactsContract.CommonDataKinds.Email.TYPE,
                            ContactsContract.CommonDataKinds.Email.TYPE_WORK)
                            .withValue(
                                    ContactsContract.Data.MIMETYPE,
                                    ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
                                    .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS,
                                            email).build());
        } else if (!email.equals(emailantigo)) {
debug("email " + email);
            debug("id " + contactId);
            ops.add(ContentProviderOperation
                    .newUpdate(ContactsContract.Data.CONTENT_URI)
                    .withSelection(
                            ContactsContract.RawContacts.CONTACT_ID
                            + "=? AND "
                                    + ContactsContract.Data.MIMETYPE
                                    + "='"
                                            + ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE
                                            + "'",
                                            new String[] { String.valueOf(contactId) })
                                            .withValue(ContactsContract.CommonDataKinds.Email.TYPE,
                                                    ContactsContract.CommonDataKinds.Email.TYPE_WORK)
                                                    .withValue(
                                                            ContactsContract.Data.MIMETYPE,
                                                            ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
                                                            .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS,
                                                                    email).build());
        }
        try {
            cr.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (Exception e) {
            e.printStackTrace();
        }
    public void debug(String msg) {
            Log.i("CONTATOS", msg);
        }

LogCatから取得した例外は次のとおりです。

java.lang.NullPointerException
android.os.Parcel.readException(Parcel.java:1266)
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)
android.database.DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel(DatabaseUtils.java:137)
android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:460)
android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:95)
android.content.ContentResolver.applyBatch(ContentResolver.java:622)

** 編集 2 **

自分で解決策を見つけた

動作する部分的なコード:

Cursor cursorEmail = cr.query(
                ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = "
                        + contactId, null, null);

        if (cursorEmail.moveToFirst()) {
            if (!email.equals(emailantigo))
                key_email = ops
                        .add(ContentProviderOperation
                                .newUpdate(ContactsContract.Data.CONTENT_URI)
                                .withSelection(
                                        ContactsContract.Data.CONTACT_ID
                                                + "=? AND "
                                                + ContactsContract.Data.MIMETYPE
                                                + "=? AND "
                                                + ContactsContract.CommonDataKinds.Email.TYPE
                                                + "=?",
                                        new String[] {
                                                String.valueOf(contactId),
                                                ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE,
                                                String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_WORK) })
                                .withValue(
                                        ContactsContract.Data.MIMETYPE,
                                        ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
                                .withValue(
                                        ContactsContract.CommonDataKinds.Email.TYPE,
                                        ContactsContract.CommonDataKinds.Email.TYPE_WORK)
                                .withValue(
                                        ContactsContract.CommonDataKinds.Email.ADDRESS,
                                        email).build());
        }
        cursorEmail.close();

        if (!key_email && emailantigo.equals("") && !email.equals(emailantigo)) {
            ops.add(ContentProviderOperation
                    .newInsert(ContactsContract.Data.CONTENT_URI)
                    .withValue(ContactsContract.Data.RAW_CONTACT_ID,
                            String.valueOf(contactId))
                    .withValue(
                            ContactsContract.Data.MIMETYPE,
                            ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
                    .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS,
                            email)
                    .withValue(ContactsContract.CommonDataKinds.Email.TYPE,
                            ContactsContract.CommonDataKinds.Email.TYPE_WORK)
                    .build());
        }

newInsert は Data._ID または Data.Contact_ID では機能しません。理由はわかりませんが、これには何らかのロジックが必要ですが、現在は機能しています ^^ !

Obs: 同期された連絡先ではテストされていません。

4

0 に答える 0