【问题标题】:Jquery Json Cordova issueJquery Json Cordova 问题
【发布时间】:2016-01-19 07:27:34
【问题描述】:

我在使用以下功能时遇到了问题。目的是从 Json 提要中获取数据,并使用 jquery mobile 将其添加到离线数据库中。数据库部分工作正常。 json 部分可以很好地获取数据,但由于某种原因无法将其添加到数据库中。

可能是 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.');
    }
}); 

}

【问题讨论】:

    标签: jquery json sqlite cordova web-sql


    【解决方案1】:

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

    解决方案是在$.ajax 回调中运行事务。以下是我将如何修改代码(如果使用 Cordova-sqlite-storage 插件):

    // @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 插件之外的其他东西,您可能需要打开一个新事务以 DROP 并 CREATE Picato 表。

    更新:我刚刚在http://www.brodybits.com/cordova/sqlite/api/jquery/2015/10/26/populating-cordova-sqlite-storage-with-the-jquery-api.htmlhttp://www.brodybits.com/cordova/sqlite/api/jquery/2015/10/26/populating-cordova-sqlite-storage-with-the-jquery-api.html

    上发布了一篇描述解决方案以及示例代码和示例项目的博文

    【讨论】:

    • 感谢您的建议,但仍然没有用。其他一切正常。它只是循环中的 tx.executesql 行似乎失败了,但我不知道为什么。还有其他想法吗?
    • 似乎 db.transaction 在 $.ajax 回调中仍然不起作用
    • 我建议你发布一个完整的、独立的测试程序来证明这个问题。另外,我建议你先用 Web SQL 试试。如果您在使用 Web SQL 时遇到同样的问题,将会有更多人能够帮助您。
    • @JeremyWalmsley 请看一下github.com/brodybits/cordova-sqlite-ajax-demo - 它完整地演示了如何将 JQuery AJAX 中的 JSON 与 Cordova-sqite-storage 插件一起使用。如果您觉得它有帮助,请告诉我,我很乐意更新我的答案。当我有机会帮助他人时,我打算记录下来。
    猜你喜欢
    • 2016-07-18
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多