使用AJAX填充Cordova数据库

时间:2014-03-20 16:45:10

标签: javascript jquery ajax database cordova

按照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!");
}
你能帮助我吗? 谢谢!

1 个答案:

答案 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);
}

代码绝对不是理想的,但它应该可以正常工作。