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

如何通过ContactsContract.Data.CONTENT_URI判断联系人是否标记删除?

关于通过ContactsContract.Data.CONTENT_URI判断联系人删除状态的问题

嘿,我来帮你解决这个问题~

首先直接给结论:可以通过这个URI间接判断联系人是否被标记为删除,但不能直接查询DELETED列,这也是你触发SQL异常的核心原因。

为什么查DELETED列会报错?

ContactsContract.Data表本身并没有DELETED这个字段——这个字段属于ContactsContract.RawContacts表,用来标记单个原始联系人是否被删除。你直接在Data URI的查询里请求这个不存在的列,自然会抛出SQL异常提示列不存在。

正确的实现方式

要获取联系人的删除状态,你需要通过Data.RAW_CONTACT_ID关联到RawContacts表,把RawContacts.DELETED作为查询的投影列之一。结合你提到的ContentQuery接口,大概的代码结构如下:

// 构建查询,关联RawContacts获取DELETED状态
ContentQuery query = new ContentQuery.Builder(ContactsContract.Data.CONTENT_URI)
    .projection(
        ContactsContract.Data._ID,
        ContactsContract.Data.DISPLAY_NAME,
        ContactsContract.RawContacts.DELETED // 加入RawContacts的DELETED字段
        // 其他你需要查询的字段
    )
    // 如果需要筛选特定联系人,可以添加selection条件
    .selection(ContactsContract.Data.CONTACT_ID + " = ?")
    .selectionArgs(new String[]{"目标联系人ID"})
    .build();

// 执行查询后,从Cursor中获取DELETED值
try (Cursor cursor = query.execute()) {
    if (cursor.moveToFirst()) {
        int deletedColumnIndex = cursor.getColumnIndex(ContactsContract.RawContacts.DELETED);
        boolean isDeleted = cursor.getInt(deletedColumnIndex) == 1;
        // 处理删除状态逻辑
    }
}

补充说明

如果你需要判断的是聚合后的联系人(即多个RawContacts合并后的联系人)是否被标记为删除,可以直接查询ContactsContract.Contacts.CONTENT_URI并获取ContactsContract.Contacts.DELETED字段,但这和你当前使用的Data URI场景不同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:35:59