React Native SQLite LIKE查询无结果及多分类筛选问题
React Native SQLite 查询问题解决
一、LIKE条件返回空数组的修复
你的代码存在语法笔误:参数中写成了%${query}$%,这里的$是错误符号,应该替换为%,导致实际匹配的是带$后缀的字符串,自然无法查询到结果。
修复后的单条件查询代码:
return new Promise((resolve, reject) => { db.transaction((tx) => { tx.executeSql( "select * from menuitems WHERE title LIKE ?", [`%${query}%`], // 将$修正为% (_, { rows }) => { useDevLogData(rows._array, "filterByQueryAndCategories rows._array"); resolve(rows._array); // 需手动resolve结果供外部获取 }, (_, error) => { reject(error); // 新增错误回调捕获异常 return true; // 终止事务避免后续执行 } ); }, reject); });
二、模糊搜索+分类IN的联合查询实现
要实现title LIKE %xxx% AND category IN (分类1,分类2)的效果,需动态生成IN子句的占位符,同时将模糊搜索参数与分类数组参数合并,避免SQL注入风险。
完整实现代码:
const filterMenuItems = (searchQuery, categories) => { return new Promise((resolve, reject) => { db.transaction((tx) => { let sql = "select * from menuitems WHERE 1=1"; const params = []; // 拼接模糊搜索条件 if (searchQuery) { sql += " AND title LIKE ?"; params.push(`%${searchQuery}%`); } // 拼接分类IN条件 if (categories?.length > 0) { // 生成对应数量的?占位符 const placeholders = categories.map(() => "?").join(","); sql += ` AND category IN (${placeholders})`; params.push(...categories); // 展开分类数组加入参数列表 } tx.executeSql( sql, params, (_, { rows }) => { useDevLogData(rows._array, "filterByQueryAndCategories rows._array"); resolve(rows._array); }, (_, error) => { reject(error); return true; } ); }, reject); }); }; // 使用示例 filterMenuItems("Spinach", ["Appetizers", "Salads"]) .then(items => console.log("筛选结果:", items)) .catch(err => console.error("查询错误:", err));
代码说明
- 用
WHERE 1=1作为基础条件,方便后续灵活拼接AND子句,避免空条件或单条件时的SQL语法错误 - 动态生成IN子句的占位符,永远不要直接将分类字符串拼接进SQL,防止SQL注入
- 严格对应SQL占位符与参数数组的顺序,确保查询逻辑正确
- 新增错误回调,便于排查执行过程中的异常
内容的提问来源于stack exchange,提问作者gpbaculio
相关产品推荐
相关产品推荐

