2015-11-14 13 views
5

Devo ammettere che io sono molto nuovo a IndexedDBUncaught InvalidStateError: Impossibile eseguire 'transazione' on 'IDBDatabase': Una transazione cambio di versione è in esecuzione

Ho scritto un semplice codice di indexedDB ed è come seguito:

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)} 
    }} 

l'errore che mi sta dando è Uncaught InvalidStateError: Failed to execute 'transaction' on 'IDBDatabase': A version change transaction is running.

si sta dicendo che A version change Transaction is running ma per quanto ho studiato, una transazione cambio di versione è realizzata in IDBFactory.open metodo e non ho usato e ho specificato che questa transazione è readwrite e questa transazione è in onupgradeneeded quindi perché c'è un errore?

devo ammettere che sono molto nuovo a IndexedDB

risposta

5

L'operazione versionchange permette anche di readwrite. Hai solo bisogno di accedere alla transazione creata per te all'interno della funzione onupgradededed.

function go() { 
    var req = indexeddb.open(...); 
    req.onupgradeneeded = function(event) { 
    var db = event.target.result; 
    var os = ... 
    var transaction = event.target.transaction;// the important part 
    var addRequest = transaction.objectStore('').index('').add('value'); 
    addRequest.onsuccess = function() {console.log('Success!');}; 
    }; 
} 

si è verificato l'errore, perché si sta tentando di avviare una seconda operazione, mentre la transazione cambio di versione è ancora in esecuzione.

+0

ma come faccio a specificare la durata dell'operazione ? –

+0

e mi sta dando un errore 'Uncaught NotFoundError: Impossibile eseguire 'objectStore' su 'IDBTransaction': L'archivio oggetti specificato non è stato trovato. On line' transaction.objectStore ('text') ' –

1

in una modifica della versione non è necessario specificare un ambito per la transazione. Questo è sempre tutti gli archivi degli oggetti prenset. transaction.objectStore('text') qui si sta tentando di aprire un archivio oggetti con il nome dell'indice, questo non funzionerà. Devi prima andare all'oggrezzo oggetti se vuoi accedere all'indice.

L'aggiunta di dati deve essere eseguita sull'oggrezzo.

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)} 
}} 

dare una prova

4

È necessario controllare per il completamento della transazione cambio di versione prima di tentare di caricare l'archivio di oggetti:

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 
      } 
    }