2015-10-20 132 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