Javascript 如何更新indexedDB中的数据?
我曾试图从indexedDB数据库中获取有关objectStore项更新的一些信息,但没有那么成功。 我找到了一种方法,但对我来说并不管用 我的实现是这样的Javascript 如何更新indexedDB中的数据?,javascript,html,indexeddb,Javascript,Html,Indexeddb,我曾试图从indexedDB数据库中获取有关objectStore项更新的一些信息,但没有那么成功。 我找到了一种方法,但对我来说并不管用 我的实现是这样的 DBM.activitati.edit = function(id, obj, callback){ var transaction = DBM.db.transaction(["activitati"], IDBTransaction.READ_WRITE); var objectStore = transaction.o
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.activati(add | remove | getAll | getById | getByIndex)方法都在工作,但我无法解决这个问题
如果你知道我怎么办,请告诉我
谢谢大家! 查看下面的示例,了解如何更新IDB记录。我用另一个StackOverflower解决了这个问题——这是IndexedDB的一个相当不错的独立示例,它使用索引并进行更新
您似乎正在寻找的方法是,如果存在唯一索引,它将插入或更新记录。在该示例中,fiddle的用法如下:
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.log
中的“console”拼错为“conosole”。这是用户对象的更新信息
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");
}
}
回答有点晚,但可能对其他人有帮助。正如我猜想的那样,我仍然在同一个问题上绊倒,但这很简单: 如果要插入或更新记录,请使用
objectStore.put(object)
如果只想插入记录,请使用
objectStore.add(object)
因此,如果您使用add(object)
,并且数据库中仍然存在记录键,它将不会被覆盖并触发错误0“ConstraintError:对象存储中已存在记录键”。如果您使用
put(object)
,它将被覆盖。我迟到了几年,但我想最好能加上我的两分钱
首先,如果您不想处理复杂的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 :)
}
非常感谢。这个indexedDB看起来越来越好!我想它不知道怎么这么容易处理这件事。IDB太棒了。如果你遇到了问题,可以主动询问,但也可以从中寻找问题的答案。我尽量不让任何问题无人回答。清晰易懂,易于实施+1@buley如何将值附加到IDB中的数组字段?感谢大家关注cursor.update()。MDN:“返回IDBRequest对象,并在单独的线程中更新对象存储中光标当前位置的值。这可用于更新特定记录。”