Android 中数据库查询方法query() 中的selectionArgs 参数只能在编译之前确定,这怎么实现动态查询?

 我来答
百度网友98abf1f
2013-07-01 · TA获得超过1836个赞
知道大有可为答主
回答量:1961
采纳率:0%
帮助的人:1315万
展开全部
网上找来的
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 
      //...... 更多参数省略 
  ); 
  // ...... 更多代码 
}
pkxutao
2013-05-24 · TA获得超过167个赞
知道小有建树答主
回答量:264
采纳率:0%
帮助的人:248万
展开全部
你把这参数用一个变量代替呗,用的时候把想查询的东西赋给这个变量,这不久动态了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式