2017-10-11 6 views
0

내 indexedDB에 이미지 (2-3MB Base64 문자열)를 추가하면 iPad/Safari의 웹 응용 프로그램과 충돌이 발생합니다 (데스크톱의 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 
} 

나는 문자열을 저장하기 위해 색인화 사용하고 내가 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

블롭과 파일도 훨씬 더 잘 저장할 수 있어야합니다. – Endless

답변

1

이 오류는 과 (과) 관련이 없습니다. 어떤 문자를 저장하려고 시도하고 있습니까?. 코드에서 데이터베이스에 개체를 저장하려고하면이 오류가 으로 인해 발생합니다. 조사하고 문제를 설명하기에 충분한 양의 코드를 게시하지 않았습니다.

코드가 어떻게 보이는지 알지 못해도 내 추측으로 이동하는 것이 일반적입니다. 전역 데이터베이스 변수를 사용하지 마십시오. 비동기 자바 스크립트 작성법에 익숙해집니다.

편집 : 당신의 개정을 바탕으로

, 나의 다음 생각은 다른 트랜잭션 내에서 새로운 트랜잭션을 시작하고 있다는 점이다. 트랜잭션은 해당 트랜잭션을 사용하는 요청 처리가 더 이상없는 특정 시점 이후에 자동으로 종료됩니다. 오류 메시지는 트랜잭션이 비활성 상태임을 나타냅니다. 이는 트랜잭션이 끝난 시점 이후에 너무 늦게 요청 요청 (request.add, request.remove 등)을 한 것을 의미합니다.

여러 가지 방법으로 해결할 수 있지만 두 가지를 복잡하게하지 않고 다음을 시도해보십시오. 알 수없는 요청을 수행 할 때마다 모든 것에 대해 동일한 트랜잭션을 공유하십시오. 2 대신 하나의 트랜잭션을 사용하십시오. 이렇게하면 트랜잭션이 유지됩니다.

간단히 : 당신은 단지 오류가 종종 발생하는 이유에

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

답장을 보내 주셔서 감사합니다. 질문에 몇 가지 정보를 추가하겠습니다. 그것은 내가 다시 얻은 오류가 실제로 인덱스 된 DB에 다른 작업을하려고 할 때, 나는 .add()에서 오류를 얻는 방법을 알아낼 수 없다는 것입니다. 또한 Chrome에서 정상적으로 작동하지만 Safari에서만 발생하는 것처럼 보입니다. – neeko

+0

업데이트에 대해 다시 한 번 감사드립니다. 여전히 동일한 문제가 발생합니다.이 문제는 base64 문자열에있을 수 있다고 생각하십니까? 대신 BLOB를 저장하려고합니다. – neeko

+0

@neeko no. 1) 단일 tx를 사용해보십시오. 2) 전역 데이터베이스 변수를 사용하지 마십시오. – Josh

관련 문제