Вставьте новый контакт - почему 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);
Другие вопросы по тегам