2012-06-26 13 views
5

W3Cから、indexedDBデータベース内のobjectStore項目の更新に関していくつかの情報を取得しようとしましたが、あまり重大ではありません。 私はhereという方法を見つけましたが、それは本当に私にとっては役に立ちません。 。作業方法が、私はこの問題を解決することはできませんindexedDBでデータを更新するにはどうすればよいですか?

私の実装がこの

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

IDBレコードを更新する方法の例についてはjsfiddleをご覧ください。私は別のStackOverflowerでそれに取り組みました。インデックスを使用して更新を行うIndexedDBのかなりまともなスタンドアロンの例です。

あなたが探している方法は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

ありがとうございました!このindexedDBはますます良くなっています!私はそれがこのように簡単.. – Michael

+2

IDB素晴らしいですを処理するために知っていないと思いました。あなたが問題に遭遇するかどうか尋ねるだけでなく、物事についての答えをSOで検索してください。私は質問に答えられないようにしようとしない。 – buley

+2

フィドルは(クローム)動作していないようです - ちょうど(、cursor.updateに注意を描画するための1つの – 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

答えのために少し遅れの更新に関する情報の場合ですが、可能性は他の人に役立ちます。私はまだ私は同じ問題上guess- -asをつまずいたが、それは非常に簡単です:

レコードを挿入または更新する場合は、あなただけはobjectStore.add(object)(help)

を使用したレコードを挿入したい場合は、 objectStore.put(object) (help)
を使用します

add(object)を使用し、レコードキーがDB内にまだ存在する場合は、上書きされず、エラー0 "ConstraintError:Keyがオブジェクトストアに既に存在しています"が発生します。

put(object)を使用すると、上書きされます。

1

私は近年のカップルだが、で私の2セントを追加するために素敵なことだろうと思っていた。

まず、あなたが複雑なのIndexedDB APIを扱うしたくない場合はBakedGoodsをチェックしてください。

これは、すべてのネイティブおよび一部の非ネイティブクライアントストレージファシリティでストレージ操作を行うために使用できる統一されたインターフェイスを確立するライブラリです。また、それぞれのユーザーが提供する柔軟性とオプションも維持されます。ああ、それは本当にあなたによって維持されています:)。

ことで、オブジェクトストア内の1つのまたは複数のデータ項目を配置するのと同じくらい簡単になります実際の質問に答えるために今

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

...

  • IDBObjectStore.put()はストアに新しいレコードを追加、または既存の1

  • IDBObjectStore.add()は、新しいレコードを追加更新します。

    は、既存の回答に広がる貴重な情報を集約することから始めましょうストア

  • IDBCursor.update()カーソルの現在の位置のレコードを更新する

一方が見ることができるように、OPは、レコードを更新するために適切な方法を使用しています。 (少なくともAPIに関して今日)間違っている方法とは関係のない彼/彼女のコード内のいくつかは、しかし、があります。私が同定され、以下、それらを修正しました:

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 :) 
}  
関連する問題