我喜欢保持简单,所以在处理能够接收参数的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和参数作为对象或数组传递(示例将在我的博客上发布这个周末)
tx
是您想传递给queryDB的值还是您期望API填充的方法(例如交易ID)? 如果您想一起传递它,可以使用我上面详细介绍的方法。 - JohnPtx
可能是一个方法,API 将填充它,我猜测。http://dev.w3.org/html5/webdatabase/#sqltransactioncallback.... 所以如果我想传递它,那么我如何检索 ID 的值呢?是通过tx.id
吗? - cjmling