Android与SQLite新手求助:添加第二个变量后的rawQuery语句是否正确?
你的rawQuery问题分析与修正方案
嘿,作为Android和SQLite新手,你碰到的这个问题其实挺典型的~咱们先拆解下你代码里的问题:
你直接把color和equipment变量拼接到SQL语句里,这会导致两个关键问题:
- 字符串类型参数缺少单引号:如果
color或equipment是字符串(比如"red"、"GPS"),拼接后的SQL会变成SELECT car FROM cars WHERE color = red AND equipment = GPS;——SQL会把red和GPS当成列名而非字符串值,自然就报错了,这就是你添加第二个变量后出问题的核心原因。 - 存在SQL注入风险:如果有人恶意构造变量值(比如把
color设为' OR 1=1 --),拼接后的SQL会绕过条件返回所有数据,甚至破坏数据库。
正确的写法:使用参数化查询
SQLite的rawQuery支持用?作为占位符,然后在第二个参数里传入变量数组,SQLite会自动处理字符串的引号和转义,既安全又不会报错:
Cursor cursor = database.rawQuery( "SELECT car FROM cars WHERE color = ? AND equipment = ?;", new String[]{color, equipment} );
补充说明
你在数据库管理器里能正常运行,是因为你手动给字符串加了单引号(比如WHERE color = 'red'),但代码里直接拼接没加,所以才会出现差异。以后写SQL查询时,尽量用参数化的方式,别直接拼接变量,既能避免这类语法错误,也能提升安全性~
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

