Ionic3原生SQLite使用IN运算符的查询问题
解决Ionic 3 SQLite中IN查询返回空结果的问题
嘿,我一眼就看出问题出在哪了——你直接把数组传给IN(?)的参数绑定是行不通的!SQLite的?占位符只能对应单个值,当你把studentIds数组塞进去时,它会被当成一个整体字符串(比如变成'[1,2,4,5]')去匹配id字段,这显然和数据库里的数字id对不上,所以才返回空结果。
给你两个关键的修复点,直接改代码就行:
- 根据
studentIds数组的长度,生成对应数量的?占位符,比如数组有4个元素,就生成?,?,?,?,这样每个元素都有自己的占位符 - 把
studentIds数组直接作为executeSql的第二个参数,不需要再套一层数组(因为这个参数本身就接受一个参数数组)
另外还要提醒你一个小细节:你原来的代码里写的是data.rows.item[i],这是错的!rows.item是一个方法,必须用括号调用data.rows.item(i)才能拿到对应行的数据,这也是可能导致结果异常的一个点,我一起帮你修正了。
修改后的完整代码如下:
// studentIds数组 let studentIds = [1,2,4,5]; // 处理空数组的情况,避免SQL语法错误 if (studentIds.length === 0) { return Promise.resolve([]); } // 生成对应数量的占位符 const placeholders = studentIds.map(() => '?').join(','); // 查询部分 this.database.executeSql(`Select * from student where id in (${placeholders})`, studentIds).then(data => { let students = []; for(let i=0; i < data.rows.length; i++) { students.push({ id: data.rows.item(i).id, name: data.rows.item(i).name }); } return students; });
如果你的studentIds可能为空,一定要加个判断,不然生成的SQL会变成id in (),直接触发语法错误,上面的代码已经帮你处理了这种情况~
内容的提问来源于stack exchange,提问作者Venkat
相关产品推荐
相关产品推荐

