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

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

[java]  view plain copy
  1. public doQuery(long id, final String name) {  
  2.   mDb.query("some_table"// table name   
  3.         null// columns  
  4.         "id=" + id + " AND name='" + name + "'"// selection  
  5.          //...... 更多参数省略  
  6.   );  
  7. }  
 

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

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

[java]  view plain copy
  1. public void doQuery(long id, final String name) {  
  2.   mDb.query("some_table"// table name   
  3.         null// columns  
  4.         "id=" + id + " AND name=?"// selection  
  5.         new String[] {name}, //selectionArgs  
  6.          //...... 更多参数省略  
  7.   );  
  8.   // ...... 更多代码  
  9. }  
 

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

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

 

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

更多相关文章

  1. Android访问WCF服务(使用json实现参数传递)
  2. android string.xml中格式资源字符串
  3. android 中使用TextView实现分段显示不同颜色的字符串
  4. Android中Activity之间访问互传参数
  5. Flutter 与 Android 相互调用、传递参数
  6. android 解析xml字符串
  7. NestedScrollView+RecyclerView滑动冲突问题,加载更多
  8. android字符串 优化(一)
  9. Android中Message参数传递

随机推荐

  1. Android的Launcher成为系统中第一个启动
  2. Android(安卓)ANR
  3. android 代码优化:关闭输出日志
  4. j2me程序移植入android总结
  5. Android音频开发(2):如何采集一帧音频
  6. android中实现内容搜索
  7. Android深入浅出之Audio 第一部分 AudioT
  8. [原] Android(安卓)自定义View步骤
  9. 麦子学院android开发笔记:Android更换Rati
  10. Xamarin向iOS和Android引入C# Async支持