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: 同期された連絡先ではテストされていません。