0

根据文档,您可以创建一个数据库并使用以下内容填充它:

 // PhoneGap is ready
//
function onDeviceReady() {
    db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000);
    db.transaction(populateDB, errorCB, successCB);
    //accessToken=new Table('Token','id unique, tokenType, tokenValue');
    ///createTable(accessToken);
}


 // Populate the database

function populateDB(tx) {
     tx.executeSql('DROP TABLE IF EXISTS DEMO');
     tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
     tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
     tx.executeSql(
            'INSERT INTO '+tname+' (id,data) VALUES (?, ?);',
            [id,data],
            function (transaction, resultSet) {
             //success code
             alert('sucessful insertion');
             },
             errorCB
        );
}

// Transaction error callback
//
function errorCB(err) {
    alert("Error processing SQL: "+err);
}

// Transaction success callback
//
function successCB() {
    alert("success!");
}

但是,我可以在 db.transaction(populateDB, errorCB, successCB); 行中将参数传递给 populateDB 回调吗?? 如果是这样,我将如何访问该参数的值?请举个例子。任何帮助将不胜感激。

4

3 回答 3

0

您上面的代码示例看起来有点时髦。首先,看起来您在 tx.executeSql 函数中有一个 javascript 函数。这是不可能的。

这是来自 docs.phonegap.com 的示例:

function populateDB(tx) {
 tx.executeSql('DROP TABLE IF EXISTS DEMO');
 tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
 tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
 tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")');
}

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

function querySuccess(tx, results) {
console.log("Returned rows = " + results.rows.length);
// this will be true since it was a select statement and so rowsAffected was 0
if (!resultSet.rowsAffected) {
  console.log('No rows affected!');
  return false;
}

var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
db.transaction(populateDB, errorCB, querySuccess);

回调的结果被传递到回调函数的 tx 和 results 参数中。

对于您问题的第二部分,如何访问回调,这有助于了解回调系统的工作原理。在调用底层设备之前,PG 为调用创建一个标识符并存储对成功和错误回调的引用。然后,当它调用本机系统时,它会传递标识符,而不是实际的回调

如果本地调用成功,cordova.successcallback 将被写入 webview 并传递之前创建的标识符。如果失败,cordova.failurecallback 将被写入并传递相同的标识符。

我强烈建议在这里查看 github 上的 javascript 源代码,更具体地说,查看您所针对的特定平台的 exec.js 文件。它将让您更好地了解回调系统的工作原理。

于 2012-09-19T13:17:28.340 回答
0

简短的回答是否定的,不像你尝试过的那样直接。

在可以接收参数的 phonegap 应用程序上处理存储时,我使用了许多已定义的函数。我见过的很多例子都调用了很多子函数,对我来说,这是调试的噩梦。

我发现了一些关于 Web SQL 的问题,但阅读规范确实非常有助于澄清我能做什么和不能做什么。(http://www.w3.org/TR/webdatabase/

看看这段代码:

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

    var sql = "INSERT INTO DEMO (col1, col2, col3) VALUES (?, ?, ?)";
    db.transaction(function(tx) {tx.executeSql(sql, [val1, val2, val3])}, errorCB, successCB);
}

所以这个函数需要两个字符串参数和一个我创建的虚拟对象。然后将这些合并到一个 sql 字符串中,该字符串将传递给 tx.executeSql 以执行!注意我正在使用?为了替代文字,这些是通过 [] 中的参数发送的。我正在事务方法中执行 tx.executeSql,这意味着它可以单独执行并且仍将处理回调。

所以对于你的例子,我会这样做:

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

    var sql = "INSERT INTO DEMO (col1, col2, col3) VALUES (?, ?, ?)";
    db.transaction(function(tx) {tx.executeSql(sql, [val1, val2, val3])}, errorCB, successCB);
}

function populateDB(tx) {
    tx.executeSql('DROP TABLE IF EXISTS DEMO');
    tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
    dbInsert('AAA', 'BBB', 'CCC');
}
于 2013-04-19T09:26:31.753 回答
0

我们无法在“db.transaction(populateDB(somestuff),successCB,errorCB);”中的 populateDB 中发送任何参数。

交易方法将替换为 tx 变量。在此处查看源代码:https ://github.com/apache/incubator-cordova-js/blob/master/lib/android/plugin/android/storage.js

此链接中提供了解决方案:

https://stackoverflow.com/a/14988487/905511

于 2013-02-20T19:42:35.897 回答