我首先提出这样的请求:
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();
}
但遗憾的是更新部分无效。 知道如何使用第一个请求的结果和更新请求吗?
答案 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表,见上文。剩下的专栏 通过隐式连接,也可以从此表中获得。这个 便于通过单个数据元素的值进行查找,例如 电子邮件地址。