Jquery 用返回的JSON填充数据库表

Jquery 用返回的JSON填充数据库表,jquery,ajax,json,jquery-mobile,cordova,Jquery,Ajax,Json,Jquery Mobile,Cordova,我希望将一些JSON内容从Drupal网站存储到PhoneGap应用程序中的数据库表中。我正在使用ajax来实现这一点。当我运行下面的代码并检查表时,我被告知它是空的。有人知道我如何填充这个表吗 $('#newDiv').live('pageshow',function(){ function queryDB(tx) { tx.executeSql("SELECT * FROM 'tableA'", [], querySuccess, errorCB); }

我希望将一些JSON内容从Drupal网站存储到PhoneGap应用程序中的数据库表中。我正在使用ajax来实现这一点。当我运行下面的代码并检查表时,我被告知它是空的。有人知道我如何填充这个表吗

$('#newDiv').live('pageshow',function(){

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

    function querySuccess(tx, results) {
        var len = results.rows.length;
        alert("Table: " + len + " rows were found.");
        }
    }

    function createTable(tx) {

        tx.executeSql('DROP TABLE IF EXISTS "tableA"');
        var sql = "CREATE TABLE IF NOT EXISTS 'tableA' (id INTEGER PRIMARY KEY AUTOINCREMENT, step VARCHAR(50), text VARCHAR(50))";
        tx.executeSql(sql, [], successCB, errorCB); 
    }

    db.transaction(createTable, errorCB, successCB);

   $.ajax({
        url: myURL,
        type: 'post',
        data: 'tid=4',
        dataType: 'json',
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert('new_page_node_view - failed to retrieve page node');
            console.log(JSON.stringify(XMLHttpRequest));
            console.log(JSON.stringify(textStatus));
            console.log(JSON.stringify(errorThrown));
        },     
        success: function (data) {

            $.each(data, function (node_index,node_value) {
               db.transaction(function(tx){
                       tx.executeSql("INSERT INTO 'tableA' (step, text) VALUES (?, ?)",[node_value.title, node_value.body]);
               });
            });
          }
      });

    db.transaction(queryDB, errorCB, successCB);


});
嘿,提普施试试这个-

  var numInserts = 0;

  $.ajax({
        url: myURL,
        type: 'post',
        data: 'tid=4',
        dataType: 'json',
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert('new_page_node_view - failed to retrieve page node');
            console.log(JSON.stringify(XMLHttpRequest));
            console.log(JSON.stringify(textStatus));
            console.log(JSON.stringify(errorThrown));
        },     
        success: function (data) {
            numInserts = data.length; // num of inserts to expect (assumes data is in array of objects)

            $.each(data, function (node_index,node_value) {
               db.transaction(function(tx){
                       tx.executeSql("INSERT INTO 'tableA' (step, text) VALUES (?, ?)",[node_value.title, node_value.body],
                       function(tx, results){
                            numInserts--; // decrement 1 from expected num of inserts
                            if (numInserts == 0){
                                db.transaction(queryDB, errorCB, successCB);
                            }
                       }, 
                       function(tx, err){
                        console.log("insert error");
                        if (err){
                            console.log(err);
                        }
                       });
               });
            });
        }
  });
/更新-回答为什么上述方法是必要的

好的,您可能想知道为什么不在$之后立即在AJAX调用的成功回调中调用
queryDB
。每个循环如下-

   $.ajax({
        url: myURL,
        type: 'post',
        data: 'tid=4',
        dataType: 'json',
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert('new_page_node_view - failed to retrieve page node');
            console.log(JSON.stringify(XMLHttpRequest));
            console.log(JSON.stringify(textStatus));
            console.log(JSON.stringify(errorThrown));
        },     
        success: function (data) {
            $.each(data, function (node_index,node_value) {
               db.transaction(function(tx){
                    tx.executeSql("INSERT INTO 'tableA' (step, text) VALUES (?, ?)",[node_value.title, node_value.body]);
               });
            });
            db.transaction(queryDB, errorCB, successCB); // <-- the inserts could not all be finished when this gets called
        }
   });
我希望这有助于澄清为什么我使用第一种方法,而不是在AJAX调用的成功回调中运行
queryDB

希望所有这些都能对将来的人有所帮助,哈哈。

嘿,蒂普什,试试这个-

  var numInserts = 0;

  $.ajax({
        url: myURL,
        type: 'post',
        data: 'tid=4',
        dataType: 'json',
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert('new_page_node_view - failed to retrieve page node');
            console.log(JSON.stringify(XMLHttpRequest));
            console.log(JSON.stringify(textStatus));
            console.log(JSON.stringify(errorThrown));
        },     
        success: function (data) {
            numInserts = data.length; // num of inserts to expect (assumes data is in array of objects)

            $.each(data, function (node_index,node_value) {
               db.transaction(function(tx){
                       tx.executeSql("INSERT INTO 'tableA' (step, text) VALUES (?, ?)",[node_value.title, node_value.body],
                       function(tx, results){
                            numInserts--; // decrement 1 from expected num of inserts
                            if (numInserts == 0){
                                db.transaction(queryDB, errorCB, successCB);
                            }
                       }, 
                       function(tx, err){
                        console.log("insert error");
                        if (err){
                            console.log(err);
                        }
                       });
               });
            });
        }
  });
/更新-回答为什么上述方法是必要的

好的,您可能想知道为什么不在$之后立即在AJAX调用的成功回调中调用
queryDB
。每个循环如下-

   $.ajax({
        url: myURL,
        type: 'post',
        data: 'tid=4',
        dataType: 'json',
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert('new_page_node_view - failed to retrieve page node');
            console.log(JSON.stringify(XMLHttpRequest));
            console.log(JSON.stringify(textStatus));
            console.log(JSON.stringify(errorThrown));
        },     
        success: function (data) {
            $.each(data, function (node_index,node_value) {
               db.transaction(function(tx){
                    tx.executeSql("INSERT INTO 'tableA' (step, text) VALUES (?, ?)",[node_value.title, node_value.body]);
               });
            });
            db.transaction(queryDB, errorCB, successCB); // <-- the inserts could not all be finished when this gets called
        }
   });
我希望这有助于澄清为什么我使用第一种方法,而不是在AJAX调用的成功回调中运行
queryDB


希望所有这些都能对将来的人有所帮助,哈哈。

在等待AJAX完成之前,您正在运行
queryDB
事务。您应该在
success
回调中执行此操作。@Barmar这当然是其中一个问题。另一个问题是,当他调用queryDB时,并不是所有的插入都能完成-我对脚本进行了编辑,在所有插入都完全完成后,脚本将在适当的时间调用queryDB。在等待AJAX完成之前,您正在运行
queryDB
事务。您应该在
success
回调中执行此操作。@Barmar这当然是其中一个问题。另一个问题是,当他调用queryDB时,并不是所有的插入都能完成——我对脚本进行了编辑,在所有插入都完全完成后,将在适当的时间调用queryDB。这很管用,多亏了一百万罗斯。你能解释一下为什么我自己的代码没有给我任何东西吗?@tipssch Barmar在等待AJAX完成之前调用
queryDB
事务的说法是正确的。但是,即使您在AJAX调用的
success
回调中调用了
queryDB
,您的插入也可能尚未完成。这里的问题是,当您在PhoneGap中使用WebSQL时,它是异步的。我始终建议在
tx.executeSql
中实现回调,该回调将在事务完成时触发(回调也不必内联)。我将编辑我的答案并举例说明更多内容。非常感谢,这非常有帮助!我真的很感激你这么做,非常感谢罗斯。你能解释一下为什么我自己的代码没有给我任何东西吗?@tipssch Barmar在等待AJAX完成之前调用
queryDB
事务的说法是正确的。但是,即使您在AJAX调用的
success
回调中调用了
queryDB
,您的插入也可能尚未完成。这里的问题是,当您在PhoneGap中使用WebSQL时,它是异步的。我始终建议在
tx.executeSql
中实现回调,该回调将在事务完成时触发(回调也不必内联)。我将编辑我的答案并举例说明更多内容。非常感谢,这非常有帮助!我真的很感激