按照phonegap / cordova处理数据库的官方文档,我已经实现了代码,它对我来说非常适合单个表,使用AJAX回调获取JSON数据类型。
我的问题是用几个表实现这个方法。
以下是我的两个表的代码示例,但它不起作用:
的的index.html 的
<html>
<head>
<script src="js/updater.js"></script>
</head>
<body>
<input type="button" onclick="update()" value="Update DB!"></input>
</body>
</html>
的 updater.js 的
var transactions=[];
var jqxhr=null;
function update()
{
jqxhr = $.ajax( "http://www.example.com/file.php?id=100" )
.done(function(data)
{
data = JSON.parse(data);
$.each(data.elements,function(index, item)
{
transactions.push("INSERT INTO elements VALUES('"+ item.id + "','"+ item.name + "','"+ item.tel + "','"+ item.mail +"')");
});
})
.fail(function() { console.log("error"); })
.always(function() { console.log("complete"); });
jqxhr = $.ajax( "http://www.example.com/file.php?id=200" )
.done(function(data)
{
data = JSON.parse(data);
$.each(data.people,function(index, item)
{
transactions.push("INSERT INTO people VALUES('"+ item.id + "','"+ item.name + "','"+ item.nick + "','"+ item.gender +"')");
});
})
.fail(function() { console.log("error"); })
.always(function() { console.log("complete"); });
var db = window.openDatabase("Database", "1.0", "Example", 2097152);
db.transaction(populateDB, errorCB, successCB);
}
function populateDB(tx)
{
tx.executeSql('DROP TABLE IF EXISTS elements');
tx.executeSql('CREATE TABLE IF NOT EXISTS elements (id INTEGER NOT NULL PRIMARY KEY, name TEXT(32), tel TEXT(20), mail TEXT(64))');
tx.executeSql('DROP TABLE IF EXISTS people');
tx.executeSql('CREATE TABLE IF NOT EXISTS people (id INTEGER NOT NULL PRIMARY KEY, name TEXT(32), nick TEXT(20), gender TEXT(10))');
for (var i=0;i<transactions.length;i++)
{
tx.executeSql(transactions[i]);
}
}
function errorCB(err)
{
alert("Error processing SQL: "+err.code);
}
function successCB()
{
alert("Database updated!");
}
你能帮助我吗?
谢谢!
答案 0 :(得分:1)
默认情况下,所有$ .ajax请求都是异步发送的,所以我认为问题是
transactions.push("INSERT INTO people...
写完数据库后调用。
你可以在&#34;完成&#34;结束时提出第二个请求。第一个请求的功能,并在&#34;完成&#34;结束时写入数据库第二个请求的功能。它看起来很丑陋,即使你将它分成几个函数,但它应该可以工作。
使用$ .Deferred改进代码的样子: http://api.jquery.com/category/deferred-object/
jQuery.ajax&#34; async&#34; (您可以设置为&#34; false&#34;)设置自JQuery 1.8以来已弃用,因此它不是一个好的选择。 https://api.jquery.com/jQuery.ajax/
更新。第一个选项的代码(仅限重要部分):
function update()
{
jqxhr = $.ajax( "http://www.example.com/file.php?id=100" )
.done(function(data)
{
data = JSON.parse(data);
var elementsCount = data.elements.length;
$.each(data.elements,function(index, item)
{
transactions.push("INSERT INTO elements VALUES('"+ item.id + "','"+ item.name + "','"+ item.tel + "','"+ item.mail +"')");
if (index == elementsCount - 1) //making sure all elements are added to array
{
updateSecond();
}
});
});
}
function updateSecond()
{
jqxhr = $.ajax( "http://www.example.com/file.php?id=200" )
.done(function(data)
{
data = JSON.parse(data);
var elementsCount = data.people.length;
$.each(data.people,function(index, item)
{
transactions.push("INSERT INTO people VALUES('"+ item.id + "','"+ item.name + "','"+ item.nick + "','"+ item.gender +"')");
if (index == elementsCount - 1) //making sure all elements are added to array
{
dbWrite();
}
});
});
}
function dbWrite()
{
var db = window.openDatabase("Database", "1.0", "Example", 2097152);
db.transaction(populateDB, errorCB, successCB);
}
代码绝对不是理想的,但它应该可以正常工作。