You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改cr.delete()方法删除选中单个联系人而非全部联系人

问题

当前代码会删除全部联系人,请问能否编辑cr.delete()方法来删除当前选中的联系人?我尝试过使用getPosition等多种方法来选中当前联系人,但不清楚具体操作方式。

原代码:

btnContactDelete.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            AlertDialog.Builder builder = new AlertDialog.Builder(ContactDetailActivity.this);

            builder.setTitle("Confirm");
            builder.setMessage("Are you sure you want to delete this contact?");

            builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {

                @SuppressLint("Range")
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    ContentResolver cr = getContentResolver();
                    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

                    while (cur.moveToNext()) {
                         try {
                            String lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
                            Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
                            System.out.println("The uri is " + uri.toString());
                            cr.delete(uri, null, null);

                            Intent backToHomeScreen = new Intent(ContactDetailActivity.this, HomePage.class);
                            startActivity(backToHomeScreen);
                        }
                    }
                }

            });

            builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    // Do nothing
                    dialog.dismiss();
                }
            });

            AlertDialog alert = builder.create();
            alert.show();
        }
    });
}
解决方案

你的代码会删除全部联系人,原因是查询了所有联系人列表,然后通过while循环逐个删除,自然会把所有联系人都删掉。要实现删除当前选中的联系人,核心是获取当前联系人的唯一标识(比如CONTACT_ID或LOOKUP_KEY),直接定位到该联系人进行删除,不需要遍历全量数据。

步骤1:跳转至详情页时传递当前联系人标识

从联系人列表页跳转到ContactDetailActivity时,把选中联系人的CONTACT_ID通过Intent传过来:

// 假设这是列表页的跳转逻辑,contactId是当前选中项的联系人ID
Intent intent = new Intent(ContactListActivity.this, ContactDetailActivity.class);
intent.putExtra("SELECTED_CONTACT_ID", contactId);
startActivity(intent);

步骤2:在详情页接收联系人标识

在ContactDetailActivity的onCreate方法中,获取传入的联系人ID(可定义为Activity成员变量,方便后续使用):

long selectedContactId = getIntent().getLongExtra("SELECTED_CONTACT_ID", -1);

步骤3:修改删除逻辑,只删除选中的联系人

把原来点击事件中遍历Cursor的代码替换成以下逻辑,直接通过ID定位并删除:

builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
    @SuppressLint("Range")
    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (selectedContactId == -1) {
            dialog.dismiss();
            return;
        }
        ContentResolver cr = getContentResolver();
        // 根据联系人ID构建唯一的删除Uri
        Uri targetContactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, selectedContactId);
        try {
            cr.delete(targetContactUri, null, null);
            Intent backToHomeScreen = new Intent(ContactDetailActivity.this, HomePage.class);
            startActivity(backToHomeScreen);
        } catch (Exception e) {
            e.printStackTrace();
            // 可添加删除失败的提示逻辑
        }
    }
});

补充:用LOOKUP_KEY的方式(可选)

如果你更倾向于用LOOKUP_KEY(相比ID更稳定,不会因联系人更新而变化),可以在跳转时传递LOOKUP_KEY:

// 列表页跳转时
intent.putExtra("SELECTED_LOOKUP_KEY", lookupKey);

然后在详情页获取并构建Uri:

String lookupKey = getIntent().getStringExtra("SELECTED_LOOKUP_KEY");
Uri targetContactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);

内容的提问来源于stack exchange,提问作者user20791491

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:02:07