Вставьте новый контакт - почему ContentValues не работает
Следующее работает для вставки нового контакта:
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, 0)
.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
.withValue(StructuredName.GIVEN_NAME, given_name)
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Я хотел бы переключиться на ContentValues
как это более гибкий.
Тем не менее, это не удается, когда я перехожу на ContentValues
следующее:
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
ContentValues values = new ContentValues();
values.put(StructuredName.GIVEN_NAME, given_name)
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValues(values).build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Это только добавляет пустой контакт.
Похоже, я должен назвать что-то вроде withValueBackReference()
в моей новой версии, но не знаю, как это сделать. Есть идеи?
1 ответ
Решение
Оказалось, мы должны получить необработанный идентификатор контакта для вставки:
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentValues values = new ContentValues();
long id = ContentUris.parseId(resolver.insert(uri, values));
uri = Uri.parse("content://com.android.contacts/data");
values.put("raw_contact_id", id);
values.put(StructuredName.GIVEN_NAME, given_name)
resolver.insert(uri, values);