2012-03-22 7 views
0

SQLite 테이블에서 행 수를 계산하는 JS 함수를 만들려고합니다.SQLite 테이블에서 행 수를 계산하는 JS 함수

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

+0

왜 tblname이라는 전역 함수를 사용하지 않고 countRows()를 호출하기 전에 tblName = "table1"; countRows (function (num) {alert (num)}); tblName = "table2"; countRows (function (num) {alert (num)}); tx.executeSql 내부 : tx.executeSql ('SELECT id FROM'+ tblName, [], function (tx, results) – Panagiotis

+0

구현하기가 쉽지 않지만 구현하기가 쉽습니다. 마지막 쿼리는 이전 쿼리에 대한 결과를 비교할 함수를 전달합니다. 이렇게하면 하나의 쿼리를 실행할 때 이전 쿼리가 완료되었음을 알 수 있습니다. countRowsTbl1 (countRowsTbl2 (callbackAfterBothQueriesAreExecuted)); – Ivan

관련 문제