How do I return the number of rows of a table according to a search criteria in Web SQL?

StackOverflow https://stackoverflow.com//questions/11684943

  •  12-12-2019
  •  | 
  •  

Question

I have created a database called todo with table name todo having fields like title,date etc. The table is empty right now.

I have defined a function which takes title as parameter and check whether table contains that title or not.

It should return the number of rows.

GetTitle function:

todo.webdb.GetTitle = function(title) {
    var db = todo.webdb.db;
    db.transaction(function(tx){
      tx.executeSql("SELECT title FROM todo WHERE title=?", [title],
          loadTitle,
          todo.webdb.onError);
      });
  } 

loadTitle Function:

function loadTitle(tx, rs) {
    return rs.rows.length;
  }

GetTitle Function is called:

row=todo.webdb.GetTitle("Hello");
alert(row);

I get alert 'undefined' it should return 0

I am confused right now how to resolve this issue.

Was it helpful?

Solution

I think the transactions are asynchronous, so you need to callback function to receive the value.

todo.webdb.GetTitle = function(title, callback) {
    var db = todo.webdb.db;
    db.transaction(function(tx){
          tx.executeSql("SELECT title FROM todo WHERE title=?", [title],
              (function loadTitle(tx, rs){
                    callback( rs.rows.length );
              }),
              todo.webdb.onError);
      });
} 
todo.webdb.GetTitle( "Hello", function(count){
    alert( "count = " + count );
});

Here's an excellent tutorial for more information.

http://blog.darkcrimson.com/2010/05/local-databases/

Update

Don't make functions inside a loop for this main reason.

Both i and title are referencing a value created out of local scope. So the last value of assigned to both i and title will be displayed.

for (i = 0; i < itemcount; i++) {
    alert('i outside if:' + i);
    var title = x[i].getElementsByTagName("title")[0].childNodes[0].nodeValue;

    todo.webdb.GetTitle( title, function (count) {
        if (!count) {
            alert('i inside if:' + i);
            alert( title ); 
        }
    });
}

Fix: Generate a function that has the values locked in a closure.

var createTitleCallBack = function( i, title ){
    return function (count) {
        if (!count) {
            alert('i inside if:' + i);
            alert( title ); 
        }
    };
};
for (i = 0; i < itemcount; i++) {
    alert('i outside if:' + i);
    var title = x[i].getElementsByTagName("title")[0].childNodes[0].nodeValue;

    todo.webdb.GetTitle( title, createTitleCallBack( i, title ) );
}   
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top