React-Native使用react-native-sqlite-storage执行executeSql未返回ResultSet
问题原因
你遇到的这个问题是调用层级不匹配导致的:
- react-native-sqlite-storage的
executeSql存在两种调用场景:事务内调用(tx.executeSql)和db对象直接调用(db.executeSql),两种场景的成功回调参数结构不同。官方文档标注的双参数(事务对象+结果集)仅适用于事务内调用的场景,直接在db对象上调用executeSql是插件提供的便捷封装,结果集数据会直接合并到第一个事务参数中,第二个参数默认返回undefined。 - 另外如果数据库初始化时开启了
promise: true配置,回调的参数结构也会和传统回调模式存在差异,也可能触发这个问题。
解决方法
你可以根据自己的使用场景任选以下方案:
- 方案1:优先使用显式事务调用
executeSql,参数和官方文档完全匹配
let sql = "SELECT * FROM table_a;" let params = []; db.transaction(tx => { tx.executeSql(sql, params, (trans, results) => { console.log("execute success results: " + JSON.stringify(results)) resolve(results); }, (error) => { console.log("execute error: " + error); reject(error); }); });
- 方案2:保持现有调用方式,直接从第一个事务参数中取结果数据
从你的控制台输出可以看到,事务对象已经包含了完整的结果集属性:rows、rowsAffected,直接读取使用即可,不需要等第二个参数:
// 原调用逻辑不变,修改取值逻辑即可 db.executeSql(sql, params, (trans) => { const results = trans; console.log("结果行数:", results.rows.length) // 取第一行数据示例:results.rows.item(0) resolve(results); }, (error) => { console.log("execute error: " + error); reject(error); });
- 方案3:检查数据库初始化配置,若开启了
promise: true,可以直接用Promise语法调用拿结果:
db.executeSql(sql, params) .then(([trans, results]) => { console.log("结果集:", results) resolve(results) }) .catch(error => { reject(error) })
内容的提问来源于stack exchange,提问作者ProfessionalAmateur
相关产品推荐
相关产品推荐

