我正在创建一个联系人应用程序,它将具有联系人应用程序的所有基本功能(当然还有一些额外的功能)。在实现基本功能时,我被困在一个地方:
我正在进行一项活动,用户可以在其中更改联系人的城市名称。如果用户已经拥有一个城市,我可以使用以下代码对其进行更新:
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
String contactId = id; // got it from ContactsContract.Contacts._ID
String mimeType = ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE;
String selection = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ? AND " + ContactsContract.CommonDataKinds.StructuredPostal.TYPE + " = ?";
String[] values = new String[]{contactId, mimeType, String.valueOf(ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME)};
ops.add(
android.content.ContentProviderOperation.newUpdate(
android.provider.ContactsContract.Data.CONTENT_URI)
.withSelection(selection, values)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, "California")
.build()
);
contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
但是,上面的代码不适用于除了电话号码之外没有任何详细信息的联系人。浏览了很多之后,我找到了以下方法:
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
String rawContactId = id;
String mimeType = ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE;
String[] values = new String[]{contactId, mimeType, String.valueOf(ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME)};
ops.add(
android.content.ContentProviderOperation.newInsert(
android.provider.ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactId)
.withValue(ContactsContract.Data.MIMETYPE, mimeType)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, "California")
.build()
);
contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
在上述情况下,我得到的fromrawContactId
等于正常的contactId。我为不同的帐户获得了不同的 rawContactId - Google、WhatsApp、Skype 等。我尝试使用所有 rawContactIds 进行更新,但仍然没有更新。任何人都可以帮我解决它吗?ContactsContract.RawContacts.CONTENT_URI
ContactsContract.Data.CONTACT_ID