2012-06-14 61 views
0

我字面上一直在試圖整天讓Firefox服從我的意志......如何獲取SELECT COUNT(*)的值?

我想:

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(); 

它主要工作,但我不明白的價值。所有的陳述(循環中的陳述)都有什麼問題。

感謝您的任何提示...

回答

1

我試過executeAsync({...});,但我相信它是錯誤的範例,因爲我馬上想要的結果。

你不應該這樣想,存儲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(); 

參見:mozIStorageResultSetmozIStorageRow

+0

非常感謝。基本上它有兩個含義(對我來說):同步執行實際上已被棄用,並且爲了兼容性原因而保留......每個查詢結果都需要分成兩部分,一部分開始事務,另一部分觸發事件在完成的時候?! – helt

+0

是的,就是這樣。 –

1

嘗試別名計數(*)作爲總和,然後取

+0

感謝您的回答。你有一個網址或代碼片段? – helt

+0

該問題與列名無關。請不要張貼野蠻的猜測作爲答案,請參閱[如何寫一個問題的好答案?](http://meta.stackexchange.com/questions/7656/how-do-i-write-a-good - 問題的答案)和[什麼是可接受的答案?](http://meta.stackexchange.com/questions/118582/what-is-an-acceptable-answer)。 –