2015-11-14 4 views
5

Ich muss zugeben, dass ich zu IndexedDB bin sehr neuUncaught InvalidStateError: Fehler ‚Transaktion‘ auf ‚IDBDatabase‘ auszuführen: Eine Version Änderungsvorgang läuft

ich einen einfachen Code von indexedDB geschrieben, und es ist wie folgt:

function go(){var req = window.indexedDB.open("Uploader", 1), db; 
    req.onerror=function(e){console.log('Error')}; 
    req.onsuccess = function(e){db=e.target.result;}; 
    req.onupgradeneeded = function(e){console.log(db); 
     db=e.target.result;db=e.target.result; 
     var os = db.createObjectStore('Files', {keyPath:"files"}); 
      os.createIndex('text', 'text_file', {unique:false}) 
     var trans = db.transaction(['text'], "readwrite"); 
     var objectstore= trans.objectStore("text"); 
     var addreq = objectstore.add('Instructions.js'); 
      addreq.onsuccess = function(e){console.log('Success!');console.dir(e)} 
    }} 

der Fehler es gibt mir ist Uncaught InvalidStateError: Failed to execute 'transaction' on 'IDBDatabase': A version change transaction is running.

es sagt, dass A version change Transaction is running aber soweit ich studiert haben, eine Version Änderungstransaktion von IDBFactory.open Verfahren hergestellt wird und ich habe nicht verwendet, und ich habe angegeben, dass diese Transaktion readwrite ist und diese Transaktion ist in onupgradeneeded dann warum gibt es einen Fehler?

Ich muss zugeben, dass ich zu IndexedDB bin sehr neu

Antwort

5

Die versionchange Transaktion, die Sie ermöglicht auch readwrite. Sie müssen nur auf die Transaktion zugreifen, die für Sie innerhalb der Funktion onupgrade- needed erstellt wurde.

Der Fehler tritt auf, weil Sie versuchen, eine zweite Transaktion zu starten, während die Versionsänderungstransaktion noch ausgeführt wird.

+0

aber wie kann ich die Spanne der Transaktion ? –

+0

und es gibt mir einen Fehler 'Uncaught NotFoundError: Fehler beim Ausführen von 'Objektspeicher' auf 'IDBTransaction': Der angegebene Objektspeicher wurde nicht gefunden. 'Online' transaction.objectStore ('Text')' –

1

In einer Versionsänderung müssen Sie keinen Bereich für die Transaktion angeben. Dies sind immer alle vorab gespeicherten Objektspeicher. transaction.objectStore('text') Hier versuchen Sie, einen Objektspeicher mit dem Namen des Index zu öffnen, dies wird nicht funktionieren. Sie müssen zuerst zum Objektspeicher gehen, wenn Sie auf den Index zugreifen möchten.

Das Hinzufügen von Daten muss im Objektspeicher erfolgen.

function go(){var req = window.indexedDB.open("Uploader", 1), db; 
req.onerror=function(e){console.log('Error')}; 
req.onsuccess = function(e){db=e.target.result;}; 
req.onupgradeneeded = function(e){ 
    console.log(db); 
    db=e.target.result; 
    var trans=e.target.transaction; 
    var os = db.createObjectStore('Files', {keyPath:"files"}); 
     os.createIndex('text', 'text_file', {unique:false}) 
    var objectstore= trans.objectStore("Files"); 
    var addreq = objectstore.add('Instructions.js'); 
     addreq.onsuccess = function(e) {console.log('Success!');console.dir(e)} 
}} 

Geben Sie diesem einen Versuch

4

Sie müssen sich für die Fertigstellung der Version Änderungstransaktion überprüfen, bevor Sie den Objektspeicher laden:

request.onupgradeneeded = 
    function(event) { 
     db = event.target.result; 
     var store = db.createObjectStore('Files', {keyPath:"files"}); 
     var transaction = event.target.transaction; 

     transaction.oncomplete = 
      function(event) {  
       // Now store is available to be populated 
      } 
    } 
Verwandte Themen