SELECT COUNT(*)在QML中不起作用

mar*_*trz 3 sqlite qt local-storage qml qtquick2

我正在尝试用QML获取记录的数量LocalStorage,它使用的是sqlite.我们考虑一下这个片段:

function f() {
    var db = LocalStorage.openDatabaseSync(...)

    db.transaction (
        function(tx) {
            var b = tx.executeSql("SELECT * FROM t")
            console.log(b.rows.length)
            var  c = tx.executeSql("SELECT COUNT(*) FROM t")
            console.log(JSON.stringify(c))
        }
        )
}
Run Code Online (Sandbox Code Playgroud)

输出是:


qml :3 qml:{"rowsAffected":0,"insertId":"","rows":{}}

我输错了SELECT COUNT(*)什么不输出任何东西?

编辑: rows在第二个命令中只显示为空.调用

console.log(JSON.stringify(c.rows.item(0)))
Run Code Online (Sandbox Code Playgroud)

给

qml:{"COUNT(*)":3}

现在有两个问题:

  1. 为什么rows显示为空
  2. 我怎样才能进入里面的房产 c.rows.item(0)

sky*_*ack 6

要访问这些项目,您必须使用:

b.rows.item(i)
Run Code Online (Sandbox Code Playgroud)

i你要获得的项目的索引在哪里(在你的第一个例子中,i属于[0, 1, 2]你有3个项目,在第二个属性中0,你可以查询它c.rows.item(0)).

该rows字段显示为空,它是一个有效的结果,因为这些项目不属于rows字段本身(实际上你必须使用一种方法来获取它们,据我所知,该方法也可以是一个完全包含响应的纪念品数据)和item方法可能被定义为不可枚举(我无法验证它,我在沙滩上,现在很难探索Qt代码:-)).您可以安全地依赖length参数来了解是否存在返回值,因此您可以迭代它们以将其打印出来.我在我的一个项目中做了类似的事情并且工作正常.

里面的属性item(0)具有与查询相同的名称.我建议将该查询重写为:

select count(*) as cnt from t
Run Code Online (Sandbox Code Playgroud)

然后,您可以获得计数:

c.rows.item(0).cnt
Run Code Online (Sandbox Code Playgroud)