android中SqLite query中用selectionArgs处理字符传值

Android 中涉及数据库查询的地方一般都会有一个 query() 方法,而这些 query 中有大都(全部?)会有一个参数selectionArgs,比如下面这个android.database.sqlite.SQLiteDatabase.query():

[java:nogutter] view plain copy
  1. 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并不多见,更多的情况下要在运行时动态生成这个字符串,比如

[java] view plain copy
  1. publicdoQuery(longid,finalStringname){
  2. mDb.query("some_table",//tablename
  3. null,//columns
  4. "id="+id+"ANDname='"+name+"'",//selection
  5. //......更多参数省略
  6. );
  7. }

在这种情况下就要考虑一个字符转义的问题,比如如果在上面代码中传进来的 name 参数的内容里面有单引号('),就会引发一个 "SQLiteException syntax error .... "。

手工处理转义的话,也不麻烦,就是 String.replace() 调用而已。但是 Android SDK 为我们准备了selectionArgs来专门处理这种问题:

[java] view plain copy
  1. publicvoiddoQuery(longid,finalStringname){
  2. mDb.query("some_table",//tablename
  3. null,//columns
  4. "id="+id+"ANDname=?",//selection
  5. newString[]{name},//selectionArgs
  6. //......更多参数省略
  7. );
  8. //......更多代码
  9. }

也就是说我们在selection中需要嵌入字符串的地方用 ? 代替,然后在selectionArgs中依次提供各个用于替换的值就可以了。在 query() 执行时会对selectionArgs中的字符串正确转义并替换到对应的 ? 处以构成完整的 selection 字符串。 有点像 String.format()。

不过需要注意的是 ? 并不是“万金油”,只能用在原本应该是字符串出现的地方。比如下面的用法是错误的

[java] view plain copy
  1. publicvoiddoQuery(longid,finalStringname){
  2. mDb.query("some_table",//tablename
  3. null,//columns
  4. "?="+id+"ANDname=?",//selectionXXXX错误!?不能用来替换字段名
  5. newString[]{"id",name},//selectionArgs
  6. //......更多参数省略
  7. );
  8. //......更多代码
  9. }

转载地址:http://blog.csdn.net/uoyevoli/article/details/4970860

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. Python技巧匿名函数、回调函数和高阶函数
  3. python list.sort()根据多个关键字排序的方法实现
  4. 修改系统Android版本,版本号
  5. 解决Android编辑框在全屏模式下无法检测布局变化的问题
  6. 如何去除launcher 上默认的 google search bar.
  7. Android中Activity之间访问互传参数
  8. 获取Android系统信息
  9. Android菜单实现两种方式

随机推荐

  1. android通过网络下载文字和Mp3的例子
  2. Cocos2d-x学习之创建Android工程和编译
  3. Android 快速打包项目成jar包
  4. 学习android前的环境配置,准备工作,安装and
  5. Android黑盒自动化测试框架Robotium
  6. Android-动画实现原理
  7. Android中如何调用其它应用
  8. android-监听来电和去电
  9. android 视频播放器的制作
  10. 我的android 第20天 - 自定义适配器