zoukankan      html  css  js  c++  java
  • 【转】Android 中数据库查询方法 query() 中的 select

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

    view plaincopy to clipboardprint?
    public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) 
    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 并不多见,更多的情况下要在运行时动态生成这个字符串,比如

    view plaincopy to clipboardprint?
    public doQuery(long id, final String name) {  
      mDb.query("some_table", // table name   
            null, // columns  
            "id=" + id + " AND name='" + name + "'", // 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 来专门处理这种问题:

    view plaincopy to clipboardprint?
    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  
             //...... 更多参数省略  
      );  
      // ...... 更多代码  

    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()。

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

    view plaincopy to clipboardprint?
    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  
          //...... 更多参数省略  
      );  
      // ...... 更多代码  

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/uoyevoli/archive/2009/12/09/4970860.aspx

  • 相关阅读:
    lintcode:Find the Connected Component in the Undirected Graph 找出无向图汇总的相连要素
    lintcode:Recover Rotated Sorted Array恢复旋转排序数组
    lintcode:Number of Islands 岛屿的个数
    lintcode :Trailing Zeros 尾部的零
    lintcode:Flip Bits 将整数A转换为B
    lintcode:strStr 字符串查找
    lintcode:Subtree 子树
    lintcode 容易题:Partition Array by Odd and Even 奇偶分割数组
    lintcode:在二叉查找树中插入节点
    lintcode:在O(1)时间复杂度删除链表节点
  • 原文地址:https://www.cnblogs.com/wfh1988/p/1852526.html
Copyright © 2011-2022 走看看