【问题标题】:JS function to count rows in SQLite tableJS函数计算SQLite表中的行数
【发布时间】:2012-03-22 23:14:08
【问题描述】:

我正在尝试制作一个 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){}

【问题讨论】:

    标签: javascript sqlite


    【解决方案1】:

    更改查询会更好地为您服务。

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

      【讨论】:

      • 您和丹尼尔的建议非常有帮助,但它们并没有解决我的问题。我看到使用回调我可以在代码中的任何位置执行该函数,但这不是我想要做的。我正在尝试将值分配给一个变量,以便我可以计算两个表中的行数,然后将结果放入两个不同的变量中,然后使用 if 语句比较结果: if([NoOfRowsIn1stTable]>[NoOfRowsIn2ndTable]){ }.
      • 为什么不使用名为 tblname 的全局函数,在调用 countRows() 之前执行 tblName = "table1"; countRows(函数 (num) {alert(num)}); tblName="table2"; countRows(函数 (num) {alert(num)}); tx.executeSql 内部是: tx.executeSql('SELECT id FROM '+tblName, [], function (tx, results)
      • 这是一个有点丑陋的解决方案,但它最容易实现。想法是为每个查询(除了最后一个查询)传递“查询函数”进行回调。最后一个传递一个函数,它将比较先前查询的结果。这样你就知道在执行一个查询时,前一个查询已经完成:countRowsTbl1(countRowsTbl2(callbackAfterBothQueriesAreExecuted));
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2012-01-11
      • 2010-12-12
      • 2021-05-02
      • 2016-07-05
      相关资源
      最近更新 更多