मैं एक ऐसा एप्लिकेशन बना रहा हूं जहां मैं हर बार पेज लोड होने पर डेटाबेस से डेटा को फिर से खींचने का प्रयास करना चाहता हूं। यदि नेटवर्क कनेक्शन नहीं है, तो मैं IndexedDB में संग्रहीत डेटा का उपयोग करूँगा।

ऐसा करने के लिए, मैंने सोचा कि window.indexedDB.open फ़ंक्शन की असफल घटना में हमारे मौजूदा ऑब्जेक्टस्टोर को साफ़ करना समझ में आता है, फिर नए डेटा के साथ फिर से बनाना। कुछ इस तरह:

var request = window.indexedDB.open("offlineInspections",1);
        
request.onsuccess = function(event){    
    db = request.result;
    //Check if connected to network
    //If yes, pull new data
    // TODO (will use AJAX to make a server call)
    
    //Check if current data exists
    //If yes, delete
    if(db.objectStoreNames.contains("user")){
        db.deleteObjectStore("user");
    }
        
    //Load new data
    var userStore = db.createObjectStore("user",{keyPath: "id"}); //Throws error
    var transaction = event.target.transaction;
    
    transaction.oncomplete = function(event){
        console.log('New user store created');
    }
}

जब मैं इसे चलाने का प्रयास करता हूं, तो मुझे ऊपर दी गई रेखा पर निम्न त्रुटि मिलती है:

ध्यान में न आया DOMException: एक डेटाबेस पर एक उत्परिवर्तन कार्रवाई का प्रयास किया गया था जो उत्परिवर्तन की अनुमति नहीं देता था।

0
rphello101 7 नवम्बर 2020, 03:21

1 उत्तर

सबसे बढ़िया उत्तर

आप केवल ऑन-अपग्रेड किए गए ईवेंट हैंडलर फ़ंक्शन के भीतर से डेटाबेस के ऑब्जेक्ट स्टोर और इंडेक्स को बदल सकते हैं, जो एक संस्करण परिवर्तन रीड राइट ट्रांजैक्शन के संदर्भ में संचालित होता है।

ऑन-अपग्रेडेड इवेंट हैंडलर सफल ओपन रिक्वेस्ट इवेंट हैंडलर से अलग हैंडलर है। सफल ओपन इवेंट हैंडलर को ऑब्जेक्ट स्टोर या इंडेक्स में बदलाव करने की अनुमति नहीं है। सफलता की घटना केवल अपग्रेड लेनदेन पूर्ण होने के बाद होती है। उस समय तक आप एक डेटाबेस पर एक म्यूटेशन ऑपरेशन (ऑब्जेक्ट स्टोर बनाने/हटाने के लिए एक कमांड) का प्रयास कर रहे हैं, जो म्यूटेशन (एक संस्करण परिवर्तन लेनदेन के संदर्भ के बाहर) की अनुमति नहीं देता है।

इसका समाधान ऑनअपग्रेडेड हैंडलर का उपयोग करना है:

var request = indexedDb.open(...);

request.onupgradeneeded = function(event) {
  // do database changes here, e.g.
  var db = event.target.result;
  db.createObjectStore(...);
};

request.onsuccess = function(event) {
  // do database reads/writes here
  // you cannot use createObjectStore here
};
0
Josh 7 नवम्बर 2020, 08:36