Android sdk更新与联系提供商的联系

时间:2017-07-03 13:00:48

标签: android android-contacts

我首先提出这样的请求:

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

    String[] projection = new String[]{
            ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.Contacts.PHOTO_ID,
            ContactsContract.Contacts.HAS_PHONE_NUMBER,
            ContactsContract.CommonDataKinds.Phone.NUMBER
    };

    Cursor cursor = resolver.query(uri, projection, null, null, null);

    ArrayList<Contact> contactList = new ArrayList<> ();

    if (cursor != null && cursor.moveToFirst ()) {
        do {
            Contact contact = new Contact();
            contact.Id = cursor.getLong (cursor.getColumnIndex (projection [0]));
            contact.DisplayName = cursor.getString (cursor.getColumnIndex (projection [1]));
            contact.PhotoId = cursor.getString (cursor.getColumnIndex (projection [2]));
            contact.PhoneNumber = cursor.getString (cursor.getColumnIndex (projection [4]));

            contactList.add (contact);
        } while (cursor.moveToNext());

        cursor.close();
    }

    return contactList;

然后我使用第一个请求返回的ID更新联系人,如下所示:

ArrayList<ContentProviderOperation> ops = new ArrayList<>();

    // Name
    ops.add(ContentProviderOperation
            .newUpdate(ContactsContract.Data.CONTENT_URI)
            .withSelection(
                    ContactsContract.Contacts._ID
                            + "=? AND "
                            + ContactsContract.Data.MIMETYPE
                            + "=?",
                    new String[] {
                            String.valueOf(contact.Id),
                            ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE })
            .withValue(ContactsContract.Contacts.DISPLAY_NAME, contact.DisplayName)
            .build());

    try {
        resolver.applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (RemoteException e) {
        e.printStackTrace();
    } catch (OperationApplicationException e) {
        e.printStackTrace();
    }

但遗憾的是更新部分无效。 知道如何使用第一个请求的结果和更新请求吗?

1 个答案:

答案 0 :(得分:0)

您无法通过更新Contacts表来更新Data表中的字段。 投影中来自Contacts.X的所有字段都是通过隐式连接添加的,但实际上属于不同的表格。

如果我理解正确,您正在尝试更新联系人的显示名称,请按照以下步骤进行操作(请确保从ContactsContract导入所有类):

ops.add(ContentProviderOperation
        .newUpdate(Data.CONTENT_URI)
        .withSelection(Data.CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", new String[] { String.valueOf(contact.Id), StructuredName.CONTENT_ITEM_TYPE })
        .withValue(StructuredName.DISPLAY_NAME, contact.DisplayName)
        .build());

此外,仅供参考,您不需要在第一次查询中使用cursor.getColumnIndex,只需执行以下操作:

contact.Id = cursor.getLong(0);
contact.DisplayName = cursor.getString(1);
contact.PhotoId = cursor.getString(2);
contact.PhoneNumber = cursor.getString(4);

<强>文档

  

也可以使用关联的原始联系人中的某些列   通过隐式连接。其他列被排除在外   在这种背景下无趣。

...

  

关联聚合联系人表的ID列   ContactsContract.Contacts可通过隐式连接获得   ContactsContract.RawContacts表,见上文。剩下的专栏   通过隐式连接,也可以从此表中获得。这个   便于通过单个数据元素的值进行查找,例如   电子邮件地址。