4

我试图将电话号码添加到 Droid 手机上已经存在的联系人。在创建联系人的同时执行此操作很简单,因为在创建 ContentProviderOperation 时我提供的反向引用只是 0。但是尝试通过查询这样的显示名称来查找反向引用是行不通的:

Cursor rawContactsReferenceCursor = 
            contentResolver.query(Data.CONTENT_URI, 
                    new String[]{Data.RAW_CONTACT_ID},
                    Data.DISPLAY_NAME+"=\""+displayName+"\"", null, null);

虽然我确实获得了原始联系人 ID,但以下代码仅生成 IndexOutOfBoundException(rawConcactReferenceID 是我从上一个查询中获得的变量):

ArrayList<ContentProviderOperation> op_list = 
    new ArrayList<ContentProviderOperation>();
op_list.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
    .withValueBackReference(Data.RAW_CONTACT_ID, rawConcactReferenceID)
    .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
    .withValue(Phone.NUMBER, testNumber)
    .withValue(Phone.TYPE, Phone.TYPE_CUSTOM)
    .withValue(Phone.LABEL, testLabel)
    .build()); 
ContentProviderResult[] result =
    contentResolver.applyBatch(ContactsContract.AUTHORITY, op_list);

最大的挑战是大量缺乏良好的文档。我会很高兴能拿到一些工作的copypasta来学习。

干杯,

4

3 回答 3

4

我找到了答案。如果您想立即添加几项内容,这不是原子性的,但是,嘿,谁需要愚蠢的原子性?

ContentValues values = new ContentValues();
values.put(Data.RAW_CONTACT_ID, new Integer(contactId).intValue());
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, dataValue);
values.put(Phone.TYPE, Phone.TYPE_CUSTOM);
values.put(Phone.LABEL, customLabel);
Uri dataUri = getContentResolver().insert(Data.CONTENT_URI, values);
于 2010-02-05T10:13:30.027 回答
2

我在电子邮件地址方面遇到了类似的问题。这是我使用的有效解决方案:

ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
    .withValue(Data.RAW_CONTACT_ID, id)
    .withValue(Email.DATA, value)
    .withValue(Email.MIMETYPE, .Email.CONTENT_ITEM_TYPE)
    .withValue(Email.LABEL, label)
    .withValue(Email.TYPE, Email.TYPE_CUSTOM)
    .build());
ContentProviderResult[] res = cr.applyBatch(ContactsContract.AUTHORITY, ops);

相同的解决方案应该适用于电话号码。

于 2010-02-17T12:30:07.817 回答