WebSQL查询后如何正确获取结果数据?

Prog.一莹 阅读 23

折腾了一下午的WebSQL查询,每次用executeSql都拿不到数据。按照文档写了个transaction:


db.transaction(tx => {
  tx.executeSql('SELECT * FROM users', [], 
    (tx, result) => console.log(result.rows.length), 
    (tx, error) => console.log(error)
  );
});

但控制台显示rows.length一直是0,明明数据库里有数据。试过把回调换位置、改参数名都不行,用result.rows.item(0)还报undefined。难道是异步执行的问题?或者需要特别处理事务提交?

我来解答 赞 2 收藏
二维码
手机扫码查看
2 条解答
百里金梅
我之前也碰到过这问题,差点以为自己学了假的JavaScript。你代码看着没问题,但WebSQL有个坑:executeSql的回调函数里的result.rows是RowList对象,它确实有length属性,但如果你直接打印length发现是0,大概率是因为表根本没数据或者事务执行时表还没创建好。

先确认两件事。第一,你查的users表是不是真有数据?有时候我们以为插进去了,其实insert语句在另一个事务里失败了。可以在插入的时候加个error回调看看:

db.transaction(tx => {
tx.executeSql('INSERT INTO users (name) VALUES (?)', ['张三']);
});


第二,别忘了建表语句要先执行。很多人只写查询,没确保表存在。建表可以这样:

db.transaction(tx => {
tx.executeSql('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)');
});


还有就是row.item(0)报undefined,说明rows里没数据。你可以先把result.rows.length打出来,再用for循环遍一下:

for (let i = 0; i < result.rows.length; i++) {
console.log(result.rows.item(i));
}


最后提醒一句,WebSQL早就废弃了,现在都用IndexedDB。要是新项目建议别踩这个坑了,不然以后迁移头疼。不过临时调试的话,把建表和插入都加上,基本就能跑通。
点赞 5
2026-02-11 20:11
长孙淑芳
你这个写法没问题,但WebSQL是异步API,得在回调里处理数据。直接打印result.rows.length没问题,但item得用下标访问,比如result.rows.item(0)。我之前也踩过,你加个判断再访问:

if (result.rows.length > 0) {
console.log(result.rows.item(0));
}

应该能用。
点赞 6
2026-02-05 23:07