2015-11-14 2 views
5

я должен признать, что я очень новой для IndexedDBUncaught InvalidStateError: Не удалось выполнить «сделку» на «IDBDatabase»: Операция изменения версии работает

Я написал простой код из indexedDB и он, как следует:

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

ошибка это дает мне это Uncaught InvalidStateError: Failed to execute 'transaction' on 'IDBDatabase': A version change transaction is running.

он говорит, что A version change Transaction is running, но, насколько я изучал, транзакция изменения версии сделана из IDBFactory.open метода и я не использовал, и я указал, что эта транзакция равна readwrite, и эта транзакция находится в onupgradeneeded, то почему возникает ошибка?

я должен признать, что я очень новой для IndexedDB

ответ

5

Сделка versionchange также позволяет READWRITE. Вам просто нужно получить доступ к транзакции, созданной для вас в рамках функции onupgradedededed.

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

Вы встретив ошибку, потому что вы пытаетесь начать вторую транзакцию, пока транзакция изменения версии все еще работает.

+0

но как я указать срок сделки ? –

+0

и он дает мне ошибку 'Uncaught NotFoundError: не удалось выполнить 'objectStore' в 'IDBTransaction': указанное хранилище объектов не было найдено.' On line 'transaction.objectStore ('text')' –

1

При изменении версии вам не нужно указывать область транзакции. Это всегда все хранилища объектов prenset. transaction.objectStore('text') здесь вы пытаетесь открыть хранилище объектов с именем индекса, это не сработает. Прежде всего, вам нужно перейти в объектный магазин, если вы хотите получить доступ к индексу.

Добавление данных должно быть выполнено на объектный магазин.

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

Дайте это попробовать

4

Вы должны проверить для завершения транзакции изменения версии, прежде чем пытаться загрузить хранилище объекта:

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 
      } 
    } 
Смежные вопросы