Jquery 用返回的JSON填充数据库表
我希望将一些JSON内容从Drupal网站存储到PhoneGap应用程序中的数据库表中。我正在使用ajax来实现这一点。当我运行下面的代码并检查表时,我被告知它是空的。有人知道我如何填充这个表吗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); }
$('#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
中实现回调,该回调将在事务完成时触发(回调也不必内联)。我将编辑我的答案并举例说明更多内容。非常感谢,这非常有帮助!我真的很感激