从像这样的教程代码
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);
我如何实际实现这个?或者它只是像这样工作,我的身份证将被传递并进入tx?
答案 0 :(得分: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
}
因此,如果要在回调中传递自己的数据,请将其包装在函数中。否则,您使用的代码可能会自动为您执行此操作。
答案 1 :(得分: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和参数以用作对象或数组(示例将在本周末在我的博客上)
答案 2 :(得分:2)
好的,首先创建一个类帽子将处理你的数据库实例(数据库更新等)这个类将保存一个函数,你将用于所有查询的
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)去吧!
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个参数, 查询, 用于查询的参数, 回调(有3个参数,结果,状态和myparam) myparam(用于回调)
我花了一些时间来解决这个问题,但是当你这样做的时候!没有更烦人的数据库恐怖!
答案 3 :(得分:0)
我们不能发送查询功能的任何参数,如“查询DB(id)”
我通过这种方式解决了这个问题。
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);
答案 4 :(得分:0)
我认为每个人都接近回答你的问题。真的,你需要对JohnP的答案稍作修改。您应该传入带有executeSQL函数的SQLTransaction对象。所以以John的答案为基础:
var id = 'THEID';
db.transaction(function(tx){
queryDB(tx, id)
}, errorCB);
然后在定义函数的地方,您可以使用额外的变量获取id参数。
queryDB: function (tx, id) { ...your code... }
答案 5 :(得分: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);