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

查询联系人时抛出java.lang.IllegalArgumentException错误求助

解决java.lang.IllegalArgumentException: Invalid column data1异常

你遇到的这个问题确实是projection参数的问题——你把来自两个不同ContactsContract表的字段混在一起用了,导致系统找不到对应的列。

问题根源

ContactsContract.PhoneLookup 和 ContactsContract.CommonDataKinds.Phone 属于不同的数据源表:

  • PhoneLookup 是用于快速通过电话号码反向查找联系人的专用表,它的字段集合和CommonDataKinds.Phone并不完全兼容
  • 你在projection里同时混用了PhoneLookup.DISPLAY_NAME和CommonDataKinds.Phone的字段,当查询的URI对应其中一个表时,另一个表的字段就会被判定为无效列(报错里的data1其实是CommonDataKinds.Phone.NUMBER对应的底层列名,当用PhoneLookup的URI查询时,系统找不到这个列)

修正方案

根据你的需求(获取联系人姓名、电话、ID),应该统一使用ContactsContract.CommonDataKinds.Phone相关的字段和对应的URI,修正后的代码如下:

public List<ContactModel> getContacts(Context ctx) {
    List<ContactModel> list = new ArrayList<>();
    // 统一使用CommonDataKinds.Phone下的字段
    String[] projection = {
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Phone.NUMBER,
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
    };

    // 查询的URI要对应CommonDataKinds.Phone的CONTENT_URI
    Cursor cursor = ctx.getContentResolver().query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        projection,
        null,
        null,
        null
    );

    if (cursor != null && cursor.moveToFirst()) {
        do {
            String name = cursor.getString(cursor.getColumnIndex(projection[0]));
            String number = cursor.getString(cursor.getColumnIndex(projection[1]));
            long contactId = cursor.getLong(cursor.getColumnIndex(projection[2]));
            
            ContactModel model = new ContactModel();
            // 给model赋值...
            list.add(model);
        } while (cursor.moveToNext());
        cursor.close();
    }
    return list;
}

额外说明

如果你确实需要使用PhoneLookup(比如通过特定电话号码反向查询联系人信息),那projection里只能用PhoneLookup类下的字段,示例如下:

String targetNumber = "13xxxxxxxxx";
String[] projection = {
    ContactsContract.PhoneLookup.DISPLAY_NAME,
    ContactsContract.PhoneLookup._ID,
    ContactsContract.PhoneLookup.NUMBER
};
// 对应的查询URI是PhoneLookup.CONTENT_FILTER_URI拼接目标号码
Uri lookupUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(targetNumber));
Cursor cursor = ctx.getContentResolver().query(lookupUri, projection, null, null, null);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:35:00