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值,系统会自动完成参数替换
额外优化建议
- 自动释放资源:用
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()) { // 原有获取电话号码的逻辑... } } } } } }
- UI内容不叠加:每次展示新联系人信息前,先清空
contactTv的内容,避免多次选择后内容堆积:
contactTv.setText(""); // 清空原有内容 contactTv.append("ID:" + contactId); contactTv.append("\nName:" + contactName); contactTv.append("\nNumber:" + contactNum); contactTv.append("\n\n");
内容的提问来源于stack exchange,提问作者Abidstic
相关产品推荐
相关产品推荐

