16

indexedDBデータベースのobjectStoreアイテムの更新に関して、 W3Cからいくつかの情報を取得しようとしましたが、それほど成功していません。私はここでそれを行う方法を見つけましたが、それは私にとって実際にはうまくいきません。

私の実装はこのようなものです

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。(add | remove | getAll | getById | getByIndex)メソッドが機能していますが、これを解決できません。

私がそれを管理する方法を知っているなら、教えてください!

ありがとうございました!

4

4 に答える 4

27

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

価値があるのは、構文エラーの可能性があり、「console」のスペルconsole.logを「conosole」と間違えていることです。

于 2012-06-26T23:37:13.227 に答える
5

答えには少し遅れますが、他の人に役立つ可能性があります。私はまだ同じ問題につまずいた-私が推測するように-しかし、それは非常に簡単です:

使用するレコードを INSERT または UPDATE したい場合objectStore.put(object) (ヘルプ)
使用するレコードを INSERT のみしたい場合objectStore.add(object) (ヘルプ)

したがって、 を使用add(object)し、レコード キーがまだ DB に存在する場合、上書きされず、エラー 0 "ConstraintError: Key already exists in the object store" が発生します。

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

于 2016-04-24T09:40:27.340 に答える
2

私は数年遅れていますが、2セント追加できればいいと思いました.

まず、複雑な IndexedDB API を扱いたくない場合は、BakedGoodsを調べてください。

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

これを使用すると、1 つまたは複数のデータ項目をオブジェクト ストアに配置するのは、次のように簡単になります。

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

さて、実際の質問に答えるために...

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

  • IDBObjectStore.put()ストアに新しいレコードを追加するか、既存のレコードを更新します

  • 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 :)
}      
于 2016-07-09T22:33:50.370 に答える
2

これは、ユーザー オブジェクトの更新情報の場合です。

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");
    }
}
于 2015-11-09T08:54:30.980 に答える