Android:无法使用ContentProviderOperation更新或删除联系人
我正在尝试使用ContentProviderOperation在Android中创建简单的联系人插入/更新/删除操作。我已成功插入新联系人,但之后无法更新或删除 插入联系人后,我通过以下方式检索其id:Android:无法使用ContentProviderOperation更新或删除联系人,android,android-contentprovider,contacts,android-contacts,Android,Android Contentprovider,Contacts,Android Contacts,我正在尝试使用ContentProviderOperation在Android中创建简单的联系人插入/更新/删除操作。我已成功插入新联系人,但之后无法更新或删除 插入联系人后,我通过以下方式检索其id: ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); ops.add(ContentProviderOperation.newInsert(Contacts
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(...).build());
ContentProviderResult[] results = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
int idContact = Integer.parseInt(results[0].uri.getLastPathSegment());
ArrayList ops=new ArrayList();
add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).withValue(…).build());
ContentProviderResult[]results=getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);
int idContact=Integer.parseInt(结果[0].uri.getLastPathSegment());
id类似于557,然后我尝试用以下内容更新(或删除):
String selection=Data.CONTACT_ID+“=?”;
String[]selectionArgs=新字符串[]{String.valueOf(idContact)};
ArrayList ops=新的ArrayList();
添加(ContentProviderOperation.newUpdate(RawContacts.CONTENT\uURI)
.withValue(RawContacts.ACCOUNT_类型,null)
.withValue(rawscontacts.ACCOUNT_NAME,null).build());
if(firstName!=null&&name!=null){
添加(ContentProviderOperation.newUpdate(Data.CONTENT\u URI)
.带选择(选择,选择G)
.带ValueBackReference(Data.RAW\u CONTACT\u ID,0)
.withValue(Data.MIMETYPE、StructuredName.CONTENT\u ITEM\u TYPE)
.withValue(StructuredName.GIVEN_NAME,firstName)
.withValue(StructuredName.FAMILY_NAME,姓氏).build());
}
如果(电话号码!=null){
添加(ContentProviderOperation.newUpdate(Data.CONTENT\u URI)
.带选择(选择,选择G)
.带ValueBackReference(Data.RAW\u CONTACT\u ID,0)
.withValue(Data.MIMETYPE、Phone.CONTENT\u ITEM\u TYPE)
.withValue(电话号码、电话号码)
.withValue(Phone.TYPE,Phone.TYPE_MOBILE.build());
}
context.getContentResolver().applyBatch(contacts contract.AUTHORITY,ops);
没有给出错误,但是联系人没有被修改,甚至删除也有效。
我做错什么了吗?第二次和第三次更新看起来不错,但是第一次更新
ops.add(ContentProviderOperation.newUpdate(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)
.withValue(RawContacts.ACCOUNT_NAME, null).build());
看起来像是插入而不是更新,请删除此代码并重试。我终于解决了问题,错误不止一个 (一) 返回原始ID(即表的自动增量ID)而不是联系人ID,这对于对该联系人进行其他查询非常有用。 因此,在插入联系人后,我必须以其他方式检索新的联系人id,例如,我根据显示名称进行了查询,但我认为您也可以使用电话号码
ContentProviderResult[] results = context.getContentResolver()
.applyBatch(ContactsContract.AUTHORITY, ops);
int raw_id = Integer.parseInt(results[0].uri.getLastPathSegment());
Log.d(TAG, "Raw id: " + raw_id); // not so useful
// search for the contact_id
int contact_id;
String displayName = firstName + " " + surName;
String selection = ContactsContract.Contacts.DISPLAY_NAME + "=?";
String[] selectionArgs = new String[] { displayName };
Cursor cur = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, selection, selectionArgs, null);
if (cur != null) {
if(cur.moveToFirst())
contact_id = cur.getInt(cur.getColumnIndex(ContactsContract.Contacts._ID));
cur.close();
}
Log.d(TAG, "Insert complete for id: " + contact_id);
(二)
在我的更新功能中有很多错误。
首先,正如Kai所说,第一个newUpdate语句(单独的一个)是无用的。
其次,在以下更新中,withValue调用是错误的。
第三,最重要的是,我必须添加一些选择,事实上,简单的联系人id选择必须针对每种类型(姓名、电话、ecc…)进行特定选择
以下是正确的方法:
String baseSelection = Data.CONTACT_ID + "=?";
String[] baseSelectionArgs = new String[] { String.valueOf(idContact) };
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
if (firstName != null && surname != null) {
String selection = baseSelection + " AND " + Data.MIMETYPE + "=?";
String[] selectionArgs = new String[] { baseSelectionArgs[0],
StructuredName.CONTENT_ITEM_TYPE };
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(selection, selectionArgs)
.withValue(StructuredName.GIVEN_NAME, firstName)
.withValue(StructuredName.FAMILY_NAME, surname).build());
}
if (phoneNumber != null) {
String selection = baseSelection + " AND " + Data.MIMETYPE
+ "=? AND " + String.valueOf(Phone.TYPE) + " = ? ";
String[] selectionArgs = new String[] { baseSelectionArgs[0],
Phone.CONTENT_ITEM_TYPE, String.valueOf(Phone.TYPE_MOBILE) };
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(selection, selectionArgs)
.withValue(Phone.NUMBER, phoneNumber).build());
}
String baseSelection=Data.CONTACT_ID+“=?”;
String[]baseSelectionArgs=新字符串[]{String.valueOf(idContact)};
ArrayList ops=新的ArrayList();
if(firstName!=null&&name!=null){
字符串选择=baseSelection+”和“+Data.MIMETYPE+”=?”;
String[]selectionArgs=新字符串[]{baseSelectionArgs[0],
StructuredName.CONTENT\u ITEM\u TYPE};
添加(ContentProviderOperation.newUpdate(Data.CONTENT\u URI)
.带选择(选择,选择G)
.withValue(StructuredName.GIVEN_NAME,firstName)
.withValue(StructuredName.FAMILY_NAME,姓氏).build());
}
如果(电话号码!=null){
字符串选择=baseSelection+“和”+Data.MIMETYPE
+“=”和“+String.valueOf(Phone.TYPE)+”=?”;
String[]selectionArgs=新字符串[]{baseSelectionArgs[0],
Phone.CONTENT\u ITEM\u TYPE,String.valueOf(Phone.TYPE\u MOBILE)};
添加(ContentProviderOperation.newUpdate(Data.CONTENT\u URI)
.带选择(选择,选择G)
.withValue(Phone.NUMBER,phoneNumber).build());
}
你是救生员!:)这花了我一个星期的时间,最后我看到了你的解决方案。“原始联系人id”是罪魁祸首。谢谢
ContentProviderResult[] results = context.getContentResolver()
.applyBatch(ContactsContract.AUTHORITY, ops);
int raw_id = Integer.parseInt(results[0].uri.getLastPathSegment());
Log.d(TAG, "Raw id: " + raw_id); // not so useful
// search for the contact_id
int contact_id;
String displayName = firstName + " " + surName;
String selection = ContactsContract.Contacts.DISPLAY_NAME + "=?";
String[] selectionArgs = new String[] { displayName };
Cursor cur = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, selection, selectionArgs, null);
if (cur != null) {
if(cur.moveToFirst())
contact_id = cur.getInt(cur.getColumnIndex(ContactsContract.Contacts._ID));
cur.close();
}
Log.d(TAG, "Insert complete for id: " + contact_id);
String baseSelection = Data.CONTACT_ID + "=?";
String[] baseSelectionArgs = new String[] { String.valueOf(idContact) };
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
if (firstName != null && surname != null) {
String selection = baseSelection + " AND " + Data.MIMETYPE + "=?";
String[] selectionArgs = new String[] { baseSelectionArgs[0],
StructuredName.CONTENT_ITEM_TYPE };
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(selection, selectionArgs)
.withValue(StructuredName.GIVEN_NAME, firstName)
.withValue(StructuredName.FAMILY_NAME, surname).build());
}
if (phoneNumber != null) {
String selection = baseSelection + " AND " + Data.MIMETYPE
+ "=? AND " + String.valueOf(Phone.TYPE) + " = ? ";
String[] selectionArgs = new String[] { baseSelectionArgs[0],
Phone.CONTENT_ITEM_TYPE, String.valueOf(Phone.TYPE_MOBILE) };
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection(selection, selectionArgs)
.withValue(Phone.NUMBER, phoneNumber).build());
}