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恶意程序分析 (四)
  2. 关于Android中的radioGroup选择
  3. Android百度地图(一):百度地图定位sdk 类方法参数、定位原理详细
  4. Android手机客户端与Servlet交换数据(by quqi99)
  5. android中AudioRecord采集音频的参数说明
  6. 【简单的学生管理界面】Android的if语句中有字符串判断
  7. android json解析及简单例子
  8. mybatisplus的坑 insert标签insert into select无参数问题的解决
  9. Python技巧匿名函数、回调函数和高阶函数

随机推荐

  1. Android录音并根据音量大小实现简单动画
  2. [置顶] 电源管理之android内核suspend to
  3. Android(安卓)fragment使用
  4. Android(安卓)NDK开发:SeetaFace2实现人脸
  5. android: Android(安卓)Notification
  6. Android之Animation
  7. Android各种访问权限Permission详解
  8. Android入门(二):Android工程目录结构
  9. [置顶] Android(安卓)从硬件到应用:一步一
  10. Android(安卓)开发中常用英语词句