Android:无法使用ContentProviderOperation更新或删除联系人

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

我正在尝试使用ContentProviderOperation在Android中创建简单的联系人插入/更新/删除操作。我已成功插入新联系人,但之后无法更新或删除

插入联系人后,我通过以下方式检索其id:

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());
}