2012-06-26 9 views
5

मैंने किसी सूचकांक के अद्यतन के संबंध में W3C से कुछ जानकारी प्राप्त करने का प्रयास किया है, जो किसी इंडेक्सड डीबी डेटाबेस में ऑब्जेक्टस्टोर आइटम के अपडेट के बारे में है, लेकिन इतना संदेह नहीं है। मुझे here ऐसा करने का एक तरीका मिला, लेकिन यह वास्तव में मेरे लिए काम नहीं करता है।मैं अनुक्रमणित डीबी में डेटा कैसे अपडेट करूं?

मेरे कार्यान्वयन इस

DBM.activitati.edit = function(id, obj, callback){ 
    var transaction = DBM.db.transaction(["activitati"], IDBTransaction.READ_WRITE); 
    var objectStore = transaction.objectStore("activitati"); 
    var keyRange = IDBKeyRange.only(id); 

    objCursor = objectStore.openCursor(keyRange); 
    objCursor.onsuccess = function(e){ 
     var cursor = e.target.result; 
     console.log(obj); 
     var request = cursor.update(obj); 
     request.onsuccess = function(){ 
      callback(); 
     } 
     request.onerror = function(e){ 
      conosole.log("DBM.activitati.edit -> error " + e); 
     } 

    } 
    objCursor.onerror = function(e){ 
     conosole.log("DBM.activitati.edit -> error " + e); 
    }     
} 

मैं सभी DBM.activitati है की तरह कुछ है (जोड़ने | हटाने | getAll | getById | getByIndex)। काम कर रहे तरीकों, लेकिन मैं इस को हल नहीं कर सकते।

यदि आप जानते हैं कि मैं इसे कैसे प्रबंधित कर सकता हूं, तो कृपया बताएं!

धन्यवाद!

उत्तर

14

आईडीबी रिकॉर्ड अपडेट करने के तरीके के बारे में कुछ उदाहरणों के लिए यह jsfiddle देखें। मैंने उस पर एक और स्टैक ओवरफ्लॉवर के साथ काम किया - यह इंडेक्सड डीबी का एक सुंदर सभ्य स्टैंडअलोन उदाहरण है जो इंडेक्स का उपयोग करता है और अपडेट करता है।

जिस विधि को आप ढूंढ रहे हैं वह put है, जो अद्वितीय इंडेक्स होने पर रिकॉर्ड या तो रिकॉर्ड या अपडेट करेगा। कि उदाहरण बेला में, यह इस तरह से किया जाता है:

phodaDB.indexedDB.addUser = function(userObject){ 
     //console.log('adding entry: '+entryTxt); 
     var db = phodaDB.indexedDB.db; 
     var trans = db.transaction(["userData"],IDBTransaction.READ_WRITE); 
     var store = trans.objectStore("userData"); 
     var request = store.put(userObject); 

     request.onsuccess = function(e){ 
      phodaDB.indexedDB.getAllEntries(); 
     }; 
     request.onerror = function(e){ 
      console.log('Error adding: '+e); 
     }; 
    }; 

के लिए क्या इसके लायक है, तो आप कुछ संभव सिंटैक्स त्रुटि मिल गया है, गलत वर्तनी के रूप में "conosole" "कंसोल" console.log में।

+0

धन्यवाद! यह अनुक्रमित डीबी तेजी से बेहतर दिखता है! मैंने सोचा कि यह इतना आसान संभाल नहीं जानता .. – Michael

+2

आईडीबी अद्भुत है। पूछें कि क्या आप समस्याओं में भाग लेते हैं लेकिन सामानों के उत्तर के लिए एसओ भी खोजते हैं। मैं किसी भी सवाल का अनुत्तरित नहीं होने की कोशिश करता हूं। – buley

+2

फिडल काम नहीं कर रहा है (क्रोम) - बस आपको बता रहा है ... – Reinsbrain

1

यह एक उपयोगकर्ता वस्तु

var transaction = db.transaction(["tab_user"], "readwrite"); 
var store = transaction.objectStore("tab_user"); 

var req = store.openCursor(); 
req.onerror = function(event) { 
    console.log("case if have an error"); 
}; 

req.onsuccess = function(event) { 
    var cursor = event.target.result; 
    if(cursor){ 
     if(cursor.value.idUser == users.idUser){//we find by id an user we want to update 
      var user = {}; 
      user.idUser = users.idUser ; 
      user.nom = users.nom ; 

      var res = cursor.update(user); 
      res.onsuccess = function(e){ 
       console.log("update success!!"); 
      } 
      res.onerror = function(e){ 
       console.log("update failed!!"); 
      } 
     } 
     cursor.continue(); 
    } 
    else{ 
     console.log("fin mise a jour"); 
    } 
} 
+0

कर्सर.अपडेट() पर ध्यान आकर्षित करने के लिए धन्यवाद। एमडीएन: "एक आईडीबीआरएस्ट ऑब्जेक्ट देता है, और, एक अलग थ्रेड में, ऑब्जेक्ट स्टोर में कर्सर की वर्तमान स्थिति पर मान अपडेट करता है। इसका उपयोग विशिष्ट रिकॉर्ड अपडेट करने के लिए किया जा सकता है।" – Velojet

2

एक जवाब के लिए देर से थोड़ा की अद्यतन infos के मामले है, लेकिन संभव है कि यह दूसरों मदद करता है। मैं अभी भी -as ठोकर खाई मैं एक ही समस्या से अधिक guess-, लेकिन यह बहुत सरल है:

आप सम्मिलित करना या अद्यतन रिकॉर्ड आप objectStore.put(object)(help)
का उपयोग आप केवल रिकॉर्ड आप objectStore.add(object)(help)

का उपयोग सम्मिलित करना चाहते हैं, तो चाहते हैं

तो यदि आप add(object) का उपयोग करते हैं, और डीबी में एक रिकॉर्ड कुंजी अभी भी मौजूद है, तो यह ओवरराइट नहीं होगा और त्रुटि 0 को आग लग जाएगी "रोकथाम: कुंजी ऑब्जेक्ट स्टोर में पहले से मौजूद है"।

यदि आप put(object) का उपयोग करते हैं, तो इसे ओवरराइट किया जाएगा।

1

मैं देर से कुछ साल हूँ, लेकिन सोचा कि यह मेरे दो सेंट जोड़ने के लिए अच्छा होगा।

पहले, BakedGoods की जाँच करता है, तो आप जटिल IndexedDB API से निपटने के लिए नहीं करना चाहती।

यह एक पुस्तकालय है जो एक समान इंटरफेस स्थापित करता है जिसका उपयोग सभी मूल में भंडारण संचालन करने के लिए किया जा सकता है, और कुछ गैर-मूल ग्राहक भंडारण सुविधाएं। यह प्रत्येक द्वारा उपयोगकर्ता को लचीलापन और विकल्प भी बनाए रखता है। ओह, और यह वास्तव में आपके द्वारा बनाए रखा है :)।

bakedGoods.set({ 
    data: [{key: "key1", value: "value1"}, {key: "key2", value: "value2"}), 
    storageTypes: ["indexedDB"], 
    complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){} 
}); 

अब वास्तविक सवाल का जवाब देने ...: के रूप में

इसके साथ

, एक वस्तु की दुकान में एक या अधिक डेटा आइटम रखने के रूप में आसान हो सकता है

बहुमूल्य जानकारी मौजूदा जवाब में फैले के योग के द्वारा शुरू करते:

  • IDBObjectStore.put() की दुकान में एक नया रिकॉर्ड कहते हैं, या किसी मौजूदा

  • IDBObjectStore.add() को एक नया रिकॉर्ड कहते हैं अद्यतन करता है स्टोर

  • IDBCursor.update() कर्सर की वर्तमान स्थिति पर रिकॉर्ड अपडेट करता है

जैसा कि कोई देख सकता है, ओपी रिकॉर्ड अपडेट करने के लिए उपयुक्त विधि का उपयोग कर रहा है। हालांकि, उनके कोड में कई चीजें हैं, जो विधि से असंबंधित हैं, जो गलत हैं (आज कम से कम एपीआई के संबंध में)। मैंने उन्हें नीचे पहचाना और सही किया है:

var cursorRequest = objectStore.openCursor(keyRange); //Correctly define result as request 

cursorRequest.onsuccess = function(e){    //Correctly set onsuccess for request 
    var objCursor = cursorRequest.result;    //Get cursor from request 
    var obj = objCursor.value;      //Get value from existing cursor ref 
    console.log(obj); 
    var request = objCursor.update(obj);    
    request.onsuccess = function(){ 
     callback(); 
    } 
    request.onerror = function(e){ 
     console.log("DBM.activitati.edit -> error " + e); //Use "console" to log :) 
    } 

} 
cursorRequest.onerror = function(e){     //Correctly set onerror for request 
    console.log("DBM.activitati.edit -> error " + e); //Use "console" to log :) 
}  
संबंधित मुद्दे