2012-03-22 25 views
0

我想要做一個JS函數來計算SQLite表中的行。JS函數來統計SQLite表中的行

function countRows(){ 
    db.transaction(function (tx){ 
     tx.executeSql('SELECT id FROM table', [], function (tx, results) { 
      var len = results.rows.length; 
      alert(len); 
     }); 
    }); 
} 

上面的代碼在表中顯示了一些行數的警報。但是,我想創建一個返回數字而不是顯示警告框的函數。

我想:

function countRows(){ 
    db.transaction(function (tx){ 
     tx.executeSql('SELECT id FROM table', [], function (tx, results) { 
      var len = results.rows.length; 
      return len; 
     }); 
    }); 
} 

然後:

var number = countRows(); 
alert (number); // returns "undefined" 

上面的例子返回 「不確定」,而平行的例子正常工作:

function count(){ 
    return 3; 
} 
var number = count(); 
alert (number); // returns 3 

我要分配該數字給一個變量,所以我可以做另一個SQL查詢,在另一個表中計算行,並比較這兩個結果。

在PHP中,這將是:

$sql1 = mysql_query('SELECT COUNT(*) FROM table1'); 
$rows1 = mysql_result($sql1, 0); 
$sql2 = mysql_query('SELECT COUNT(*) FROM table2'); 
$rows2 = mysql_result($sql2, 0); 
if ($row1>$row2){} 

回答

2

你會送達改變您的查詢好得多。

SELECT COUNT(ID) FROM table 

另外,它是一個異步調用,以便呼叫return正在返回回調函數。你應該傳遞你自己的回調函數。

function countRows(callback){ 
    db.transaction(function (tx){ 
     tx.executeSql('SELECT id FROM table', [], function (tx, results) { 
      var len = results.rows.length; 
      callback(len); 
     }); 
    }); 
} 
2

db.transaction是異步的。返回值沒有分配給上面代碼中的任何變量。解決方案是傳遞迴調或創建自定義事件,這幾乎是相同的。

事情是這樣的:

function countRows(cb){ 
    db.transaction(function (tx){ 
     tx.executeSql('SELECT id FROM table', [], function (tx, results) { 
      var len = results.rows.length; 
      cb.call(this, len); 
     }); 
    }); 
} 

countRows(function (num) {alert(num)}); 
+0

你和丹尼爾的建議是非常有幫助的,但他們不解決我的問題。我看到使用回調函數可以在代碼中的任何地方執行函數,但這不是我想要做的。我想把值賦給一個變量,這樣我就可以計算兩個表中的行數,然後將結果放在兩個不同的變量中,然後使用if語句比較結果:if([NoOfRowsIn1stTable]> [NoOfRowsIn2ndTable]){ }。 – lukeshek 2012-03-22 15:03:17

+0

爲什麼不使用名爲tblname的全局函數,並在調用countRows()之前做一個tblName =「table1」; countRows(function(num){alert(num)}); tblName = 「表2」; countRows(function(num){alert(num)});在tx.executeSql裏面是:tx.executeSql('SELECT id FROM'+ tblName,[],function(tx,results) – Panagiotis 2012-03-22 15:25:44

+0

這是一個小小的醜陋解決方案,但它實現起來很簡單,Idea想通過「查詢函數」對於每個查詢期望的最後一個,最後一個傳遞一個函數,它將比較先前查詢的結果。這樣你就知道當執行一個查詢時,前一個查詢就完成了:countRowsTbl1(callRowBurstAllExecuted)); – Ivan 2012-03-22 16:02:22