2015-11-14 15 views
5

tôi phải thừa nhận rằng tôi rất mới để IndexedDBcủa router InvalidStateError: Không thực thi 'giao dịch' bật 'IDBDatabase': Một giao dịch phiên bản thay đổi đang chạy

Tôi đã viết một mã đơn giản của indexedDB và nó được như sau:

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ỗi nó đem lại cho tôi là Uncaught InvalidStateError: Failed to execute 'transaction' on 'IDBDatabase': A version change transaction is running.

người ta nói rằng A version change Transaction is running nhưng như xa như tôi đã nghiên cứu, một giao dịch phiên bản thay đổi được làm từ IDBFactory.open phương pháp và tôi đã không sử dụng và tôi đã chỉ định rằng giao dịch này là readwrite và giao dịch này là trong onupgradeneeded thì tại sao có lỗi?

tôi phải thừa nhận rằng tôi rất mới đối với indexedDB

Trả lời

5

Giao dịch phiên bản cũng cho phép bạn ghi đè. Bạn chỉ cần truy cập vào giao dịch được tạo cho bạn trong hàm onupgradeneeded.

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

Bạn đang gặp lỗi vì bạn đang cố bắt đầu giao dịch thứ hai trong khi giao dịch thay đổi phiên bản vẫn đang chạy.

+0

nhưng làm thế nào để xác định khoảng thời gian giao dịch ? –

+0

và nó cho tôi một lỗi 'Uncaught NotFoundError: Không thể thực thi 'objectStore' trên 'IDBTransaction': Không tìm thấy kho lưu trữ đối tượng đã chỉ định.' trên dòng' transaction.objectStore ('text') ' –

1

trong phiên bản thay đổi, bạn không cần chỉ định phạm vi cho giao dịch. Điều này luôn luôn là tất cả các cửa hàng đối tượng prenset. transaction.objectStore('text') tại đây bạn đang cố mở một cửa hàng đối tượng có tên chỉ mục, điều này sẽ không hoạt động. Bạn cần phải đi đến kho đối tượng đầu tiên nếu bạn muốn truy cập vào chỉ mục.

Việc thêm dữ liệu cần được thực hiện trên đối tượng.

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

này cung cấp cho một thử

4

Bạn cần phải kiểm tra để hoàn thành giao dịch thay đổi phiên bản trước khi thử tải các cửa hàng đối tượng:

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 
      } 
    } 
Các vấn đề liên quan