2015-10-20 86 views
1

我遇到以下功能问题。目的是从json feed获取数据并使用jquery mobile将其添加到脱机数据库。数据库部分工作正常。 json部分获取的数据很好,但由于某些原因无法将其添加到数据库。Jquery Json Cordova问题

难道tx.executable方法在json函数中是不可用的吗?如果是这样,我该如何解决这个问题?

任何想法真的很感激!

function SyncDataQuery(tx) { 
    tx.executeSql('DROP TABLE IF EXISTS Picato'); 
    tx.executeSql('CREATE TABLE IF NOT EXISTS Picato (id unique, date date,am_pm)'); 

    //code to get Json data from server. 

$.ajax({ 
    url: 'http://url1 2 3', //fake url. 
    dataType: 'jsonp', 
    jsonp: 'jsoncallback', 
    timeout: 5000, 
    success: function(data, status){ 

     $.each(data, function(i,item){ 
      var insId = parseInt(item.idservice); 
      var insDate = item.date; 
      var insTime = item.am_pm; 
      //alert(insId + insDate + insTime); 
      tx.executeSql('INSERT INTO Picato (id, date, am_pm) VALUES (insId, insDate,insTime)'); 
     }); 

    }, 
    error: function(){ 
     console.log('There was an error loading the data.'); 
    } 
}); 

} 

回答

1

tx对象不能使用,因为在运行$.ajax回调之前数据库事务完成后您的$.ajax回调执行SQL语句。如果您尝试使用Web SQL数据库对象,则会遇到同样的问题。

解决方法是在$.ajax回调中执行交易。这是我怎么会返工的代码(在使用科尔多瓦 - sqlite的存储插件的情况下):

// @param db - should be your database object 
function SyncDataQuery(db) { 
    db.executeSql('DROP TABLE IF EXISTS Picato'); 
    db.executeSql('CREATE TABLE IF NOT EXISTS Picato (id unique, date date,am_pm)'); 

    //code to get Json data from server. 

    $.ajax({ 
    url: 'http://url1 2 3', //fake url. 
    dataType: 'jsonp', 
    jsonp: 'jsoncallback', 
    timeout: 5000, 
    success: function(data, status) { 
     db.transaction(function(tx) { 
     $.each(data, function(i,item) { 
      var insId = parseInt(item.idservice); 
      var insDate = item.date; 
      var insTime = item.am_pm; 
      //alert(insId + insDate + insTime); 
      tx.executeSql('INSERT INTO Picato (id, date, am_pm) VALUES (insId, insDate,insTime)'); 
     }); 
    }); 

    }, 
    error: function(){ 
     console.log('There was an error loading the data.'); 
    } 
    }); 

} 

注意这个代码不包括任何数据库错误检查。

如果您使用的不是Cordova-sqlite-storage插件,您可能需要打开一个新的事务以删除并创建Picato表。

更新:我只是发表了博客文章来描述与示例代码和一个示例项目沿解决方​​案:http://www.brodybits.com/cordova/sqlite/api/jquery/2015/10/26/populating-cordova-sqlite-storage-with-the-jquery-api.html

+0

谢谢你的建议,但它仍然没有奏效。一切正在工作。它只是循环中的tx.executesql行,似乎失败了,但我不知道为什么。任何其他想法? –

+0

似乎db.transaction仍然无法在$ .ajax回调内工作 –

+0

我建议您发布一个完整的,自包含的测试程序,可以证明问题。另外,我建议你先用Web SQL尝试一下。如果您遇到与Web SQL相同的问题,更多人将能够为您提供帮助。 – brodybits