问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-26 08:48

我来回答

2个回答

热心网友 时间:2023-10-09 02:12

网上找来的
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 
      //...... 更多参数省略 
  ); 
  // ...... 更多代码 
}

热心网友 时间:2023-10-09 02:12

你把这参数用一个变量代替呗,用的时候把想查询的东西赋给这个变量,这不久动态了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 《孔乙己》ppt课件34 土豆生长中有哪些科学的管理方法?会产生病虫害吗? 求婚庆流程剪辑的各种音乐 5.《孔乙己》部编优质公开课课件 roome台灯蓝牙怎么开? 土豆在地里长虫病怎么才不长虫 四川简州猫是什么动物?能否介绍全面点? 大火煲汤的过程中出现水分蒸发,这样做会不会影响汤的口感? 人教版语文九年级下册《孔乙己》PPT课件 罗杰杜彼手表在上海换条皮质表带要多少钱? 黄白颜色的猫咪该穿什么颜色的衣服 人家用小锤锤锤你胸口,这句话完整的是什么? 《孔乙己》ppt课件 我这个表带会不会太松了? 求大神给两首适合中式婚礼后期剪辑的歌曲,要高潮部分明显的 求 小锤锤捶你胸口完整版,文字版 马铃薯种植适宜的温度是多少?马铃薯会发生哪些虫害呢? 请问真皮手表怎样戴比较舒服 适合婚礼后期制作的歌曲,不要太俗,多谢 nodejs exparss框架如何把query方法里的参数取出来? 为什么AVANZA激光投影机看起来更亮? neomatik系列搭配的包边表带是有几种皮革制作的? 大火煲汤的过程中会出现水分蒸发,这样会影响口感吗? 蓝牙音箱台灯一体机如何使用 发芽的土豆中会有虫子吗 《孔乙己》ppt市级公开课获奖课件 中国什么时候开始有猫? DELPHI TADOQUERY 如何获得参数替换后的最终SQL语句 听说AVANZA激光投影机有六大优点,分别是什么? 蓝牙音箱台灯怎么用 小区环境没人打扫,是物业的失职吗? 马铃薯的叶子上长的百色的小虫子是什么?有什么方法能消灭它们吗? 钢表带上左右各有一个箭头,但指向都是朝外。是两边都可以顶出卡针吗? AVANZA激光投影机有没有适合家庭用的型号? 触控led台灯蓝牙音响用蓝牙放歌怎么搜不到设备? 5.孔乙己PPT课件 狗狗到底有多可爱,你的狗狗适合当导盲犬吗? 黄色虎斑猫和三花猫会生出什么颜色的猫 nomos Metro neomatik nachtblau腕表表带是皮质的吗? 小区环境无人打扫,应当及时找物业吗?