尝试使用此代码更新联系人无效

时间:2016-05-25 09:33:56

标签: android android-contentprovider

我正在尝试使用此代码来允许用户编辑联系人的姓名和号码。我没有收到任何错误,当我在日志中打印nameofcontactnumberofcontact时,它会向我显示我对联系人姓名和号码所做的最新更改。

但它没有保存到我的联系人数据库。任何想法有什么不对?

public void editButton(View view) {

//        the text in the 'nameofcontact' edittext box, can be modified by the user
        contactname = nameofcontact.getText().toString();
//        the text in the 'numberofcontact' edittext box, can be modified by the user
        contactnumber = numberofcontact.getText().toString();

        ContentResolver cr = getContentResolver();

        String where = ContactsContract.Data.DISPLAY_NAME + " = ? AND " +
                ContactsContract.Data.MIMETYPE + " = ? AND " +
                String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE) + " = ? ";
        String[] params = new String[] {contactname,
                ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,
                String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_HOME)};

        Cursor phoneCur = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, where, params, null);

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

//        if ( (null == phoneCur)  ) {
//            createContact(name, phone);
//        } else
        {
            ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
                    .withSelection(where, params)
                    .withValue(ContactsContract.CommonDataKinds.Phone.DATA, contactnumber)
                    .build());
        }

        phoneCur.close();

        try {
            cr.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (OperationApplicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println (contactname);
        System.out.println (contactnumber);
        Toast.makeText(this, "Updated", Toast.LENGTH_SHORT).show();


    }

1 个答案:

答案 0 :(得分:0)

请检查您在演示文稿中添加以下权限

 <uses-permission android:name="android.permission.READ_CONTACTS" />
 <uses-permission android:name="android.permission.WRITE_CONTACTS" />

你可以使用这种方法对我有用。

public boolean updateContact(String name, String number, String ContactId) {
    boolean success = true;
    String phnumexp = "^[0-9]*$";

    try {
        name = name.trim();

        number = number.trim();

        if (name.equals("") && number.equals("")) {
            success = false;
        } else if ((!number.equals("")) && (!match(number, phnumexp))) {
            success = false;
        } else {
            ContentResolver contentResolver = SwipableHomeActivity.this
                    .getContentResolver();

            String where = Data.CONTACT_ID + " = ? AND "
                    + Data.MIMETYPE + " = ?";

            String[] nameParams = new String[]{
                    ContactId,
                    StructuredName.CONTENT_ITEM_TYPE};
            String[] numberParams = new String[]{
                    ContactId,
                    Phone.CONTENT_ITEM_TYPE};

            ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

            if (!name.equals("")) {
                ops.add(ContentProviderOperation
                        .newUpdate(
                                Data.CONTENT_URI)
                        .withSelection(where, nameParams)
                        .withValue(StructuredName.DISPLAY_NAME, name)
                        .build());
            }

            if (!number.equals("")) {

                ops.add(ContentProviderOperation
                        .newUpdate(
                                Data.CONTENT_URI)
                        .withSelection(where, numberParams)
                        .withValue(Phone.NUMBER, number).build());
            }
            contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
        }
    } catch (Exception e) {
        e.printStackTrace();
        success = false;
    }
    return success;
}