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

public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

selection 参数很好理解,就是 SQL 语句中 WHERE 后面的部分,即过滤条件, 比如可以为 id=3 AND name='Kevin Yuan' 表示只返回满足 id 为 3 且 name 为 "Kevin Yuan" 的记录。

再实际项目中像上面那样简单的“静态”的 selection 并不多见,更多的情况下要在运行时动态生成这个字符串,比如:
public doQuery(long id, final String name) {
mDb.query("some_table", // table name
null, // columns
"id=" + id + " AND name='" + name + "'", // selection
//...... 更多参数省略
);
}

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

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

public void doQuery(long id, final String name) {
mDb.query("some_table", // table name
null, // columns
"id=" + id + " AND name=?", // selection
new String[] {name}, //selectionArgs
//...... 更多参数省略
);
// ...... 更多代码
}

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

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

public void doQuery(long id, final String name) {
mDb.query("some_table", // table name
null, // columns
"? = " + id + " AND name=?", // selection XXXX 错误!? 不能用来替换字段名
new String[]{"id", name}, //selectionArgs
//...... 更多参数省略
);
// ...... 更多代码

}

http://blog.csdn.net/uoyevoli/article/details/4970860

更多相关文章

  1. android中AudioRecord采集音频的参数说明
  2. 【简单的学生管理界面】Android的if语句中有字符串判断
  3. android实现json数据的解析和把数据转换成json格式的字符串
  4. Android Jetpack应指南学习笔记8——Navigation(二)使用safe arg
  5. Android 时间字符串 转成UTC时间转为指定时间的时间字符串
  6. android上传图片和参数(属性)到服务器
  7. android 字符串数组资源
  8. Android jni中数组参数的传递方式
  9. Android 访问Webservice接口,参数对象不能串行化问题解决(java.lan

随机推荐

  1. android 图表引擎
  2. android studio 常见问题
  3. Android应用程序安装过程源代码分析(3)
  4. Ubuntu 13.04 编译环境配置及android 2.3
  5. Android中使用Gallery_tabhost来实现标签
  6. alps/frameworks/base/wifi/java/android
  7. Android(安卓)APK 打包
  8. 与spinner有关的样式
  9. android短信和彩信探秘threads
  10. android音乐播放器常见操作