2012-01-08 89 views
3

从教程这样的代码我怎么能传递参数,在交易的回调函数

function queryDB(tx) { 
    tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB); 
} 

function querySuccess(tx, results) { 

} 

function errorCB(err) { 
    alert("Error processing SQL: "+err.code); 
} 

var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000); 
db.transaction(queryDB, errorCB); 

在db.transaction我想通过一个变量作为参数传递给queryDB功能,所以我认为的代码应外观像

db.transaction(queryDB(id), errorCB); 

我该如何实际执行此操作?或者它只是简单的像这样工作,我的ID会通过并得到tx?

回答

6

再次把它包在一个函数

var id = 'THEID'; 
db.transaction(function(){ 
    queryDB(id) 
}, errorCB); 

注意 - 这是假设你正在做的API。一些API /框架自动插入所需的信息。例如

//the db.transaction method 
function transaction(param, callback) { 
    //do code stuff 
    callback(someInternalId); //callback is the function you pass as the first parameter 
} 

所以,如果您想在回调中传递自己的数据,请将其包装在一个函数中。否则,您使用的代码可能会自动为您执行此操作。

+0

所以确实在queryDB()函数我会得到价值与tx.id的ID? *我正在使用phonegap – cjmling 2012-01-08 07:18:11

+0

就像我说的那样,这取决于phonegap的API(我没有使用它)。是'tx'你想传递给queryDB的值吗?或者您期望API填写的方法(如事务ID)。如果你想传递它,你可以使用上面详述的方法。 – JohnP 2012-01-08 07:30:02

+0

'tx'可能是一个方法,API会填补我的猜测,http://dev.w3.org/html5/webdatabase/#sqltransactioncallback ....所以如果我想传递它,那么我如何检索值ID ..是由tx.id吗? – cjmling 2012-01-08 08:59:37

2

好吧首先是创建一个类的帽子会处理你数据库实例(DB更新等),该类会认为你将使用所有你查询的

self.db = window.openDatabase(// and so on 

那么函数的函数:

// execute a query and fetches the data as an array of objects 
self.executeQuery = function(string, args, callback, callbackparams) { 
    var self = this; 
    //console.log('db execute: '+string); 
    self.db.transaction(function(tx) { 
     tx.executeSql(string, args, function(tx, result) { 
      var retval = []; 
      for (var i = 0; i < result.rows.length; ++i) { 
       retval.push(result.rows.item(i)); 
      } 
      if (callback) { 
       callback(retval, result, callbackparams); 
      } 

     }, self.error); 
    }); 
} 

然后当你发起你是类(我把它命名为myDb)去apeshit!

myDb.executeQuery('select l.* from location l inner join item_location il on (il.location_id = l.id and il.item_id = ?)', [item.id], function(locations, res, item){ 
       item.locations = locations; 
       myDb.executeQuery('select * from media where item_id = ?', [item.id], function(media, res, item){ 
        item.media = media; 
        // create item. 
        createItem(item);      
       }, item); 
      }, item); 

,你可以看到的executeQuery有4个参数,可以 查询, PARAMS查询, 回调(3个PARAMS,结果,状态和myparam) myparam(回调)

花我有一段时间来解决这个问题,但是当你这样做的时候!没有更烦人的数据库恐怖!

+0

谢谢你的解释雷内,但你能解释你为什么要打2个查询?你有一个简单的例子吗? – 2012-07-04 19:54:55

0

我们无法发送任何paramenter对于喜欢“queryDB(ID)” queryDB功能

我通过这种方式解决了这个问题。

var contactId = 33 
dbInst.transaction(function(tx){ 
    tx.executeSql('CREATE TABLE IF NOT EXISTS CONTACT_REFERENCE (id unique)'); 
    var sqlStr = 'INSERT INTO CONTACT_REFERENCE (id) VALUES (?)' 
    tx.executeSql(sqlStr, [contactId]); 
}, errorCB, successCB); 
0

我想每个人都接近回答你的问题。真的,你需要对JohnP的答案稍作修改。你应该传入带有executeSQL函数的SQLTransaction对象。因此,要建立在约翰的回答是:

var id = 'THEID'; 
db.transaction(function(tx){ 
    queryDB(tx, id) 
}, errorCB); 

然后在其中定义,你可以用一个额外的变量抓住你的ID PARAM功能。

queryDB: function (tx, id) { ...your code... } 
6

我喜欢让事情变得很简单,所以我使用的功能数量有限,在可以接收参数的PhoneGap应用程序中处理存储时。很多我看到的例子都调用了许多子函数,对于我来说,调试时这是一场噩梦。

我被Web SQL遇到了一些问题,但是阅读规范确实有助于澄清我可以做什么和不可以做什么。 (http://www.w3.org/TR/webdatabase/

看看这个简单的代码插入函数:

function dbInsert(param1, param2, dbObj) { 
    val1 = param1; 
    val2 = param2; 
    val3 = String(dbObj.item2); 

    var sqlTxt = "INSERT INTO demo (geo1, geo2, geo3) VALUES (?, ?, ?)"; 
    db.transaction(function(tx) {tx.executeSql(sqlTxt,[val1,val2,val3])}, errorCB, successCB); 
    } 

就让我们通过它走。很明显,一个接收参数的标准函数可以是任何东西,在这种情况下也是一个对象以及一个字符串。

sqlTxt是乐趣开始的地方。按照通常写入插入语句的方式写入,但通常在VALUES中使用要将数据传递到数据库表中的每个字段的占位符。

现在,让我们打破了下一行:

db.transaction(function(tx) {tx.executeSql(sqlTxt,[val1,val2,val3])}, errorCB, successCB); 

当您创建一个新的数据库,db是处理程序的数据库对象,以便db.transaction要求对数据库DB执行事务。

如果我们这样写下一个下一节,您可以看到它的函数调用tx.executeSql,并且因为它在执行db.transaction方法时会通过db句柄。

function(tx) { 
    tx.executeSql(sqlTxt,[val1,val2,val3]) 
} 

现在如果我们解析SQLTXT它可能看起来像这样

INSERT INTO demo (geo1, geo2, geo3) VALUES ('a', 'b', 'c'); 

因为我们传递三个变量来代替的?持有人,它看起来像上面的行。最后你调用错误和成功回调函数。

在你的情况我会创造一个queryDB功能是这样的:

function queryDB(id) { 
    var sqlTxt = "SELECT * FROM DEMO WHERE id=?" 
    db.transaction(function(tx) {tx.executeSql(sqlTxt,[id])}, errorCB, successCB); 
} 

从本质上讲,功能抓起参数ID,它传递到查询的[ID]和执行,并返回错误或成功。显然你可以扩展这个以使用多个参数,或者如果你想要非常聪明,你只需创建一个单一的数据库事务函数,并传入sql和参数以用作对象或数组(本例中将在我的博客上)

0

这是一个工作的解决方案:

var sqltxt= 'INSERT INTO CONTACTS(id, data) VALUES (?, ?)'; 
    var db = window.openDatabase("Database", "1.0", "Demo", 200000); 
    db.transaction(function(tx){tx.executeSql('DROP TABLE IF EXISTS CONTACTS'); 
      tx.executeSql('CREATE TABLE IF NOT EXISTS CONTACTS(name unique, password)'); 

      tx.executeSql(sqltxt,[name, pass]); 

    }, errorCB, successCB);