在sqlite中执行'in'查询操作,如何使用selectionargs匹配多个值

在安卓开发中,经常使用到sqlite作为本地持久化存储的解决方案。在androidSDK中,已经为我们提供了各种各样的增、删、改、查的api,尽管我们可以自己写sql语句然后执行db.rawsql(sql,null)方法,但这种方法有一些风险,那就是拼接的关键字有可能是非法的,这样会造成很多意想不到并且很危险的后果。因此,建议使用sdk提供的api来做数据库操作,android已经为我们屏蔽了这一层风险。

在使用sqlite查询时,我们经常会使用“in”操作符来进行查询,如

select * from tablename where userid in('张三','李四','王五');

上面这条语句可以正确执行,但是正如上文提到的,这种方法是不安全的。因此,我们应该使用database.rawquery()方法来执行。那么,问题来了:学挖掘机技,不是,应该怎么传递这个方法的参数呢?通常我们会在拼接sql的时候用?这个占位符来表示一个关键词,如果in后面的括号里有多个关键词,那么有几个关键词我们就应该传几个?进去。因此可以使用下面这个方法来拼接这个占位符:

String makePlaceholders(int len) {
        if (len < 1) {
            throw new RuntimeException("No placeholders");
        } else {
            StringBuilder sb = new StringBuilder(len * 2 - 1);
            sb.append("?");
            for (int i = 1; i < len; i++) {
                sb.append(",?");
            }
            return sb.toString();
        }
    }

在使用时可以这样做:

String placeHolder = makePlaceholders(usernames.size());
                String sql = "select distinct username from " + TABLENAME + " where username in (" + placeHolder + ")";
                String args = "";
                for(int i = 0;i<usernames.size();i++){
                    args += tagUID.get(i).toString() + ",";
                }
                if(args.Length>1)args = args.substring(0,args.Length-1);
                cursor = db.rawQuery(sql, args.split(","));

ok,搞定~

在sqlite中执行'in'查询操作,如何使用selectionargs匹配多个值

时间: 2024-08-25 11:40:34

在sqlite中执行'in'查询操作,如何使用selectionargs匹配多个值的相关文章

Shell脚本中执行sql语句操作

这篇文章主要介绍了Shell脚本中执行sql语句操作mysql的5种方法,本文讲解了将SQL语句直接嵌入到shell脚本文件中.命令行调用单独的SQL文件.使用管道符调用SQL文件等方法,需要的朋友可以参考下 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的结果美化,需要进一步完善和调整.以下为具体的示例及其方法. 1.将SQL语句直接嵌入到sh

[PY3]——怎样在数据字典中执行一些计算操作(比如求最大值、排序等)

问题 怎样在数据字典中执行一些计算操作(比如求最小值.最大值.排序等等)? 解决方案 zip( ) 1. 为了对字典值执行计算操作,通常需要使用 zip() 函数先将键和值反转过来 2. 类似的,也可以使用 zip() 和 sorted() 函数来排列字典数据 prices = { 'ACME': 37.20, 'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.20, 'FB': 10.75 } print(min(prices),max(prices)) #直接

详细讲述MySQL中的子查询操作 (来自脚本之家)

继续做以下的前期准备工作: 新建一个测试数据库TestDB: ? 1 create database TestDB; 创建测试表table1和table2: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE table1 (   customer_id VARCHAR(10) NOT NULL,   city VARCHAR(10) NOT NULL,   PRIMARY KEY(customer_id) )ENGINE=INNODB DEFAULT CH

Android Sqlite数据库执行插入查询更新删除的操作对比

下面是在Android4.0上,利用Sqlite数据库的insert,query,update,delete函数以及execSql,rawQuery函数执行插入,查询,更新,删除操作花费时间的对比结果. 是在执行相同的动作,记录条数也一样的情况下的对比,多次验证的结果是: (1)如果批量执行的记录数在1000条,则Android SqliteDatabase提供的insert,query,update,delete函数和直接写SQL文的execSql,rawQuery的效率差不多,几乎一样.所以

在事务中执行批量复制操作SqlBulkCopy,SqlTransaction .

Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上).SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案.还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势. 使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可

mybatis中sql语句查询操作

动态sql where if where可以自动处理第一个and. <!-- 根据id查询用户信息 --> <!-- public User findUserById(int id); --> <select id="findUserById" parameterType="user" resultType="user"> select * from user <!-- 当有if条件成立时,where会自

shell 中执行Oracle查询和执行存储过程

[oracle@master2 test]$ more b.sh #!/bin/sh #数据库地址 ip=192.168.1.250 port=1521 sid=orcl username=c##scott password=tiger oracle_name="${username}/${password}@${ip}:${port}/${sid}" #查询一个值 QUERYRETS=`sqlplus -s /nolog <<EOF set echo off feedba

Oracle 在函数或存储过程中执行一条插入语句并返回主键ID值

有时,我们需要往一张表插入一条记录,同时返回主键ID值. 假定主键ID的值都是通过对应表的SEQUENCE来获得,然后进行ID赋值 这里有几种情况需要注意: 1)如果建表语句含有主键ID的触发器,通过触发器来实现主键ID的自增,实现方式如下: INSERT INTO GP_MONTH_BILL ( MONTH, BONUS_VALUE, CUR_WAY, CUR_TIME, STATUS, IS_USE, CREATE_TIME) VALUES ( CUR_MONTH, CUR_BONUS_VA

C#3.0中的新增功能09 LINQ 04 基本 LINQ 查询操作

连载目录    [已更新最新开发文章,点击查看详细] 本篇介绍 LINQ 查询表达式和一些在查询中执行的典型操作. 获取数据源 在 LINQ 查询中,第一步是指定数据源. 和大多数编程语言相同,在使用 C# 时也必须先声明变量,然后才能使用它. 在 LINQ 查询中,先使用 from 子句引入数据源 (customers) 和范围变量 (cust) . // 从 IEnumerable<Customer> 中查询所有的客户信息 var queryAllCustomers = from cust