2017-10-11 54 views
0

當我將一個圖像(2-3mb base64字符串)添加到我的索引數據庫中時,它似乎與從iPad/Safari使用Web應用程序時崩潰(在Chrome桌面上正常工作)。IndexedDB在添加記錄時崩潰圖像

InvalidStateError (DOM IDBDatabase Exception 11): Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing. 

對象試圖插入:

{ 
categoryNo: "C0103" 
imageData: [{base64Image: "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD…aUOUbIHsTUsVwQRZJF8/94dMe9TxKzK7ugwhK1s4su8T/2Q==", 
imageUploaded: false 
} 

我使用IndexedDB的存儲字符串,它工作正常,只是當我嘗試添加的對象,與以base64圖像。

bcUpdateIDB: function(sInspectionNo, sLineNo, sCategory, oRecord){ 
      var oController = this; 
      var objectStore = oController.myDB.transaction("imageDB").objectStore("imageDB"); 

     var items = []; 
     objectStore.openCursor().onsuccess = function(event) { 
      var cursor = event.target.result; 
      if (cursor) { 
       items.push(cursor.value); 
       cursor.continue(); 
      } else { 
       dataRecords = items; 
       var oTransaction = oController.myDB.transaction(["imageDB"], "readwrite"); 
       var oDataStore = oTransaction.objectStore("imageDB"); 

       var recordFound = false; 
       for (var i=0; i<dataRecords.length;i++){ 
        var oDataRecord = dataRecords[i]; 
        if(oDataRecord.lineNo === sLineNo && oDataRecord.inspectionNo === sInspectionNo && oDataRecord.category === sCategory){ 
         recordFound = true; 
         oDataStore.delete(oDataRecord.id); 
         if(oRecord.imageData.length > 0){ 
          oDataStore.add(oRecord); 
         } 

        } 
       } 

       if(!recordFound){ 
        oDataStore.add(oRecord); 
       } 

      } 
     }; 

在Safari中它似乎掛在'.add()',這在Chrome中有效。此外,其他添加/刪除操作對另一個事務工作正常。

+0

你應該能夠存儲blob和文件,以及更好。 – Endless

回答

1

這個錯誤與無關你試圖存儲什麼。發生此錯誤的原因是,當您嘗試在代碼中的數據庫中存儲對象時。您沒有發佈足夠的代碼來調查和解釋問題。

不知道代碼是什麼樣的,我的猜測是通常的。不要使用全局數據庫變量。熟悉如何編寫異步JavaScript。

編輯:

根據您的修改,我的下一個猜測是,你從其他事務中開始一個新的事務。在沒有更多使用該事務的請求處理的時間點之後,事務在一段時間後自動結束。錯誤消息表明事務處於非活動狀態,這意味着您在事務結束的時間點之後執行了一些請求調用(request.add,request.remove等)。

有很多方法可以解決這個問題,但是如果沒有兩個複雜的問題,請嘗試以下操作。無論何時您要執行未知數量的請求,都會共享相同的事務。使用一個事務而不是兩個事務。這將保持交易活着。

簡述:

bcUpdateIDB: function(sInspectionNo, sLineNo, sCategory, oRecord){ 
     var oController = this; 
     var oTransaction = oController.myDB.transaction("imageDB", "readwrite"); 
     var objectStore = oTransaction.objectStore("imageDB"); 
// ... 
     } else { 
      dataRecords = items; 
      // Now this reuses the one transaction instead of a new one 
      var oDataStore = oTransaction.objectStore("imageDB"); 

至於爲什麼你只遇到的錯誤有時會?那麼我的猜測是小字符串操作更快,所以事務不會超時,但是對於更大的對象,請求更慢,所以超時實際上發生了。

+0

感謝您的回覆,我會在問題中添加一些信息。看來我得到的錯誤實際上是當我嘗試對索引分區執行另一個操作時,我無法弄清楚如何從.add()中獲取錯誤。此外,這在Chrome中運行正常,看起來像只發生在Safari – neeko

+0

再次感謝您的更新,仍然得到同樣的問題 - 你認爲它可以與base64字符串?我會嘗試存儲一個blob而不是 – neeko

+0

@neeko沒有。 1)嘗試使用一個單一的TX。 2)不要使用全局數據庫變量。 – Josh