1

シリアル化された画像をwebsqlに保存しているアプリがあります。最初にxmlから画像リストを取得し、jsonpを返す個々のファイル(進行状況インジケーターを表示できるようにするための個々のファイル)につながるパスの配列を作成します。応答を受け取った後、シリアル化された画像をdb関数に渡します。この関数は挿入を実行し、成功した場合は画像パス配列を更新してから、次のajaxリクエストを開始します。これは私のローカルマシンで正常に動作します。iOS(エミュレーターとデバイス)では、ある時点で、たとえば300番目の画像のあたりで、すべてのWebSQLトランザクションが失敗します。彼らはエラーコードやテキストなしでそうしているので、そこで何が起こっているのかわかりません。そして、executeSqlではなく、失敗するトランザクションです。

シリアル化されたデータの長さは平均で約45kで、最大6桁になるものもあります。失敗するtxnのパターンはありません-文字列の長さはランダムです-唯一の一貫したことは、特定のポイントの後の何百もの成功したtxnのすべての後、残りのWeb sqlトランザクション(そのポイントで約157)が失敗することです。

プロセスは非常に直線的です。ajaxを介してデータを取得します-データを確認します(タイムスタンプなど)-挿入関数にルーティングしてから、繰り返します。

私のコンピューターのSQLliteデータベースのサイズは約35MBなので、デバイスの上限に達しているとは思いません。

これはCordova2.2でラップされています。jQueryはAjaxリクエストに使用されます(後で説明します)。Rippleを搭載した最新のChromeのWindowsマシンでは、エラーはまったく発生しません。すべての画像がダウンロードされます。

コードサンプル:

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'));
}
4

0 に答える 0