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

Android联系人选择功能崩溃:SQLite语法错误问题求助

问题解决:选择联系人后App崩溃(SQLite语法错误)

错误原因分析

从报错日志里生成的SQL语句能看到,最后条件部分是AND (contact_id 2)——明显少了比较运算符(比如=),这是查询联系人电话号码时,条件拼接错误导致的SQL语法问题。

看核心代码里onActivityResult方法的这段代码:

cursor2 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " " + contactId,
        null,
        null);

这里直接把CONTACT_ID和contactId用空格拼接,生成的SQL条件就变成了contact_id 2(假设contactId是2),完全不符合SQL语法规范,数据库自然抛出语法错误。

修复方案

用参数化查询修改这段代码,既能避免语法错误,还能防止SQL注入风险:

cursor2 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?",
        new String[]{contactId},
        null);
  • 第三个参数:用=?做占位符,明确查询条件的格式
  • 第四个参数:通过字符串数组传实际的contactId值,系统会自动完成参数替换

额外优化建议

  1. 自动释放资源:用try-with-resources语句自动关闭Cursor,避免手动关闭遗漏导致的资源泄漏:
try (Cursor cursor1 = getContentResolver().query(uri, null, null, null, null)) {
    if (cursor1 != null && cursor1.moveToFirst()) {
        // 原有获取联系人基础信息的逻辑...
        if (idResulthold == 1) {
            try (Cursor cursor2 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?",
                    new String[]{contactId},
                    null)) {
                if (cursor2 != null) {
                    while (cursor2.moveToNext()) {
                        // 原有获取电话号码的逻辑...
                    }
                }
            }
        }
    }
}
  1. UI内容不叠加:每次展示新联系人信息前,先清空contactTv的内容,避免多次选择后内容堆积:
contactTv.setText(""); // 清空原有内容
contactTv.append("ID:" + contactId);
contactTv.append("\nName:" + contactName);
contactTv.append("\nNumber:" + contactNum);
contactTv.append("\n\n");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:05:27