2015-11-14 11 views
5

मैं मानता होगा कि मैं बहुत IndexedDBUncaught InvalidStateError: एक संस्करण परिवर्तन लेन-देन चल रहा है

करने के लिए नए मैं indexedDB का एक सरल कोड लिखा हूँ और यह पीछा किया जाता है के रूप में: 'IDBDatabase' चालू 'लेन-देन' निष्पादित करने में विफल:

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 करने की अनुमति देता है। तुम बस 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!');}; 
    }; 
} 

आपको त्रुटि का सामना करना पड़ रहा है क्योंकि आप दूसरा लेनदेन शुरू करने की कोशिश कर रहे हैं जबकि संस्करण परिवर्तन लेनदेन अभी भी चल रहा है।

+0

लेकिन मैं कैसे लेन-देन की अवधि निर्दिष्ट करूँ ? –

+0

और यह मेरे एक त्रुटि 'Uncaught NotFoundError दे रहा है: 'IDBTransaction' चालू 'ObjectStore' निष्पादित करने में विफल: निर्दिष्ट वस्तु दुकान लाइन पर found.' नहीं किया गया था' transaction.objectStore ('पाठ') ' –

1

संस्करण परिवर्तन में आपको लेनदेन के लिए एक दायरा निर्दिष्ट करने की आवश्यकता नहीं है। यह हमेशा सभी prenset वस्तु भंडार है। यहाँ transaction.objectStore('text') आप सूचकांक के नाम के साथ एक वस्तु की दुकान खोलने के लिए कोशिश कर रहे हैं, यह काम करने के लिए नहीं जा रहा है। आप पहली बार ObjectStore पर जाने के लिए आप सूचकांक का उपयोग करना चाहते हैं की जरूरत है।

ऑब्जेक्टस्टोर पर डेटा जोड़ने की आवश्यकता है।

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 
      } 
    } 
संबंधित मुद्दे