我一直在努力让Firefox遵守我的意愿......
我想:
int c = SELECT COUNT(*) FROM ...
我已经尝试了executeAsync({...});
,但我认为这是错误的范例,因为我想立即得到结果。 (mozIStoragePendingStatement
导致错误)
var count = 0;
var conn = Services.storage.openDatabase(dbfile); // Will also create the file if it does not exist
let statement = conn.createStatement("SELECT COUNT(*) FROM edges LIMIT 42;");
console.log("columns: " + statement.columnCount); // prints "1";
console.log("col name:" + statement.getColumnName(0)); // is "COUNT(*)"
while (statement.executeStep())
count = statement.row.getResultByIndex(0); // "illegal value"
count = statement.row.getString(0); // "illegal value", too
count = statement.row.COUNT(*); // hahaha. still not working
count = statement.row[0]; // hahaha. "undefinded"
count = statement.row[1]; // hahaha. "undefinded"
}
statement.reset();
它基本上有效,但我没有得到价值。所有语句(循环内的语句)都有什么问题。
感谢任何提示......
答案 0 :(得分:1)
我已经尝试了
executeAsync({...});
,但我认为这是错误的范例,因为我想立即得到结果。
你不应该这样,因为某种原因,Storage API是异步的。对数据库的同步访问可能导致随机延迟(例如,如果硬盘驱动器繁忙)。并且由于您的代码在主线程(为用户界面提供服务的同一线程)上执行,因此当您的代码等待数据库响应时,整个用户界面将挂起。 Mozilla开发人员尝试在Firefox 3中进行同步数据库访问,并很快注意到它降低了用户体验 - 因此异步API,数据库处理在后台线程上发生而不会阻塞任何内容。
您应该将代码更改为异步工作。这样的事情应该做例如:
Components.utils.import("resource://gre/modules/Services.jsm");
var conn = Services.storage.openDatabase(dbfile);
if (conn.schemaVersion < 1)
{
conn.createTable("edges", "s INTEGER, t INTEGER");
conn.schemaVersion = 1;
}
var statement = conn.createStatement("SELECT COUNT(*) FROM edges");
statement.executeAsync({
handleResult: function(resultSet)
{
var row = resultSet.getNextRow();
var count = row.getResultByIndex(0);
processResult(count);
},
handleError: function(error) {},
handleCompletion: function(reason) {}
});
// Close connection once the pending operations are completed
conn.asyncClose();
答案 1 :(得分:1)
尝试将别名计数(*)作为总计,然后获取