android中SqLite query中用selectionArgs处理字符传值
Android 中涉及数据库查询的地方一般都会有一个 query() 方法,而这些 query 中有大都(全部?)会有一个参数selectionArgs,比如下面这个android.database.sqlite.SQLiteDatabase.query():
- publicCursorquery(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy)
selection参数很好理解,就是 SQL 语句中 WHERE 后面的部分,即过滤条件, 比如可以为 id=3 AND name='Kevin Yuan' 表示只返回满足 id 为 3 且 name 为 "Kevin Yuan" 的记录。
再实际项目中像上面那样简单的“静态”的selection并不多见,更多的情况下要在运行时动态生成这个字符串,比如
- publicdoQuery(longid,finalStringname){
- mDb.query("some_table",//tablename
- null,//columns
- "id="+id+"ANDname='"+name+"'",//selection
- //......更多参数省略
- );
- }
在这种情况下就要考虑一个字符转义的问题,比如如果在上面代码中传进来的 name 参数的内容里面有单引号('),就会引发一个 "SQLiteException syntax error .... "。
手工处理转义的话,也不麻烦,就是 String.replace() 调用而已。但是 Android SDK 为我们准备了selectionArgs来专门处理这种问题:
- publicvoiddoQuery(longid,finalStringname){
- mDb.query("some_table",//tablename
- null,//columns
- "id="+id+"ANDname=?",//selection
- newString[]{name},//selectionArgs
- //......更多参数省略
- );
- //......更多代码
- }
也就是说我们在selection中需要嵌入字符串的地方用 ? 代替,然后在selectionArgs中依次提供各个用于替换的值就可以了。在 query() 执行时会对selectionArgs中的字符串正确转义并替换到对应的 ? 处以构成完整的 selection 字符串。 有点像 String.format()。
不过需要注意的是 ? 并不是“万金油”,只能用在原本应该是字符串出现的地方。比如下面的用法是错误的:
- publicvoiddoQuery(longid,finalStringname){
- mDb.query("some_table",//tablename
- null,//columns
- "?="+id+"ANDname=?",//selectionXXXX错误!?不能用来替换字段名
- newString[]{"id",name},//selectionArgs
- //......更多参数省略
- );
- //......更多代码
- }
转载地址:http://blog.csdn.net/uoyevoli/article/details/4970860