我正在创建一个联系人应用程序,它将具有联系人应用程序的所有基本功能(当然还有一些其他功能)。在实现基本功能时,我被困在一个地方:
我正在进行一项活动,用户可以在其中更改联系人的城市名称。如果用户已经有一个城市,则可以使用以下代码进行更新:
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,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,ops);
在上述情况下,我从rawContactId
获得了ContactsContract.RawContacts.CONTENT_URI
的{{1}}与正常的contactId相等。我为不同的帐户(Google,WhatsApp,Skype等)获得了不同的rawContactId。我尝试使用所有rawContactIds进行更新,但仍未更新。有人可以帮我解决该问题吗?