大约300 txns后WebSQL静默事务失败

时间:2013-01-18 16:25:38

标签: html5 cordova web-sql

我有一个应用程序,我将序列化的图像存储到websql中。我首先从xml获取图像列表,创建一个路径数组,这些路径导致返回jsonp的单个文件(单个文件,以便我可以有一个进度指示器)。在我得到响应之后,我将序列化图像传递给我的db函数然后执行插入,成功更新图像路径数组,然后启动下一个ajax请求。这在我的本地机器上工作正常。在iOS(模拟器和设备)中发生的事情是,在某个点 - 比如大约300个左右的图像,我的所有WebSQL事务都会失败。他们这样做没有任何错误代码或文本,所以我不知道那里发生了什么。它的失败事务,而不是executeSql。

序列化数据的长度平均约为45k,有些最多可达6位数。在txn上没有模式失败 - 字符串长度是随机的 - 唯一一致的是,在数百个成功的txn之后,某个点之后的所有内容都因剩余的web sql事务而失败(此时约为157)。

该过程非常线性:通过ajax获取数据 - 检查它(时间戳等) - 路由到插入函数,然后重复。

我计算机上的SQL lite数据库大小约为35mb,所以我认为我不会在设备上达到上限。

这包含在Cordova2.2中。 jQuery用于Ajax请求(正如您将看到的)。在我的Windows机器上使用Ripple的最新镀铬工具我没有任何错误 - 所有图像下载。

代码示例:

var _SQL_DB = null;
var _SQL_DB_SETTINGS = {name:'myapp',version:'1.0',displayname:'myapp db',size:(50 * 1024 * 1024)};

// much code removed, here's the database init:
function initWebSQL(){
  _SQL_DB = window.openDatabase(_SQL_DB_SETTINGS.name, _SQL_DB_SETTINGS.version, _SQL_DB_SETTINGS.displayname, _SQL_DB_SETTINGS.size);
  _SQL_DB.transaction(
    function(tx){
      tx.executeSql('CREATE TABLE IF NOT EXISTS IMAGES (ID INTEGER PRIMARY KEY ASC, FNAME TEXT, FDATE TEXT, DATASTR TEXT)');},
    function(){ // error CB
      app.util.printToConsole('IMAGES table was not created');
    },
    function(){ // success CB
      app.util.printToConsole('IMAGES table was created succesfully');
    }
  );
}

// ... fast forward through more code....

// ajax request
function _startImgCaching(){
  $.ajax({
    url: app.host() + path,
    type:'GET',
    dataType:'JSONP',
timeout:    10000,
    error:function(xhr,status,err){
      // error logic removed
    },
    success:function(responseData,status,xhr){
      // save data
      _dbInsert(rawPath,_queue.images[0].date,responseData.data);
     // check if more need to be downloaded and stored locally
     if (_queue.length > 0){
       _queue.images.splice(0,1);
       app.util.updateProgress(_queue.length,_queue.images.length);
       setTimeout(_cacheImages,200); 
     }
});

// verify the data, check timestamps...
function _cacheImages(){
  // removed logic that checks for duplicates and routes to delete/insert methods as needed
}

// do the insert
function _dbInsert(imgName,imgDate,imgData){
  _SQL_DB.transaction(
    function(tx){
      tx.executeSql('INSERT INTO IMAGES(FNAME, FDATE, DATASTR) VALUES (?,?,?)',
        [imgName,imgDate,imgData],
        _insertSuccess,
        _insertFailure
      );
    },_transactionFailure,_transactionSuccess
  );
}

// the txn callbacks
function _transactionSuccess(tx,r){
  app.util.printToConsole('txn successful');
  if (r){
    app.util.printToConsole(r);
  }
}

function _transactionFailure(tx,e){
  // e in this case is always undefined
  app.util.printToConsole('txn failed - ' + (e ? e.message : 'no err msg available'));
}

0 个答案:

没有答案