Javascript 如何获取objectstore.add()添加到IndexedDB的对象的(自动递增)id?
我正在开发一个WebExtension,并使用IndexedDB来存储对象。当我存储一个新对象时,它将不是唯一的。因此,我使用自动递增的id使其唯一。在第一次添加之后,我将做一些工作,修改/更新一些属性,因此必须更新数据库中的对象。但是要更新一个对象,我需要知道它的ID,到目前为止我还不知道 这是我向数据库添加对象的代码:Javascript 如何获取objectstore.add()添加到IndexedDB的对象的(自动递增)id?,javascript,indexeddb,Javascript,Indexeddb,我正在开发一个WebExtension,并使用IndexedDB来存储对象。当我存储一个新对象时,它将不是唯一的。因此,我使用自动递增的id使其唯一。在第一次添加之后,我将做一些工作,修改/更新一些属性,因此必须更新数据库中的对象。但是要更新一个对象,我需要知道它的ID,到目前为止我还不知道 这是我向数据库添加对象的代码: const dbName=“MyDb”; 常数dbVersion=1; const storeName=“MyStore”; 函数addObject(obj){ const
const dbName=“MyDb”;
常数dbVersion=1;
const storeName=“MyStore”;
函数addObject(obj){
const request=window.indexedDB.open(dbName,dbVersion);
request.onupgradeneeded=事件=>{
const db=event.target.result;
const objectStore=db.createObjectStore(storeName,{keyPath:'id',autoIncrement:true});
}
request.onsuccess=事件=>{
const db=event.target.result;
const transaction=db.transaction(storeName,'readwrite');
const objectStore=transaction.objectStore(storeName);
objectStore.add(obj);
transaction.onerror=事件=>{
console.error('添加对象时出错:',event.target.error.message);
};
//如何获取/返回先前添加的对象的ID?
transaction.onsuccess=事件=>{
日志(event.target.result);
};
transaction.oncomplete=事件=>{
日志(event.target.result);
};
}
}
addObject({prop1:“foo”,prop2:“bar”,prop3:,prop4:”});
类似问题的答案-和-建议在成功添加后查询event.target.result
,但在上述代码中返回undefined
,尽管对象已成功插入
那么,有没有一种方法可以获取刚刚添加的对象的ID呢?结果是,我听错了事件处理程序。您不必听事务的
onsuccess
/oncomplete
,而必须听查询的onsuccess
此外,我将所有内容都打包成一个承诺
,以便能够在id可用时尽快获取它
这是一个工作示例:
const dbName=“MyDb”;
常数dbVersion=1;
const storeName=“MyStore”;
函数addObject(obj){
返回新承诺(函数(解析){
const request=window.indexedDB.open(dbName,dbVersion);
request.onupgradeneeded=事件=>{
const db=event.target.result;
const objectStore=db.createObjectStore(storeName,{keyPath:'id',autoIncrement:true});
};
request.onsuccess=事件=>{
const db=event.target.result;
const transaction=db.transaction(storeName,'readwrite');
const objectStore=transaction.objectStore(storeName);
const query=objectStore.add(obj);
transaction.onerror=事件=>{
console.error('添加对象时出错:',event.target.error.message);
};
query.onsuccess=事件=>{
返回解析(event.target.result);//或:返回解析(query.result);
};
};
});
}
let id=await addObject({prop1:foo),prop2:bar,prop3:,prop4:});
结果是,我听错了事件处理程序。您不必听事务的onsuccess
/oncomplete
,而必须听查询的onsuccess
此外,我将所有内容都打包成一个承诺
,以便能够在id可用时尽快获取它
这是一个工作示例:
const dbName=“MyDb”;
常数dbVersion=1;
const storeName=“MyStore”;
函数addObject(obj){
返回新承诺(函数(解析){
const request=window.indexedDB.open(dbName,dbVersion);
request.onupgradeneeded=事件=>{
const db=event.target.result;
const objectStore=db.createObjectStore(storeName,{keyPath:'id',autoIncrement:true});
};
request.onsuccess=事件=>{
const db=event.target.result;
const transaction=db.transaction(storeName,'readwrite');
const objectStore=transaction.objectStore(storeName);
const query=objectStore.add(obj);
transaction.onerror=事件=>{
console.error('添加对象时出错:',event.target.error.message);
};
query.onsuccess=事件=>{
返回解析(event.target.result);//或:返回解析(query.result);
};
};
});
}
let id=await addObject({prop1:foo),prop2:bar,prop3:,prop4:});
与请求相关的成功事件,而不是与事务相关的成功事件。这是有区别的。如果更改console.log(event.target.result)会怎么样代码>到控制台日志(事件)代码>?这些事件的内幕是什么?@Josh Thx,就是这样!与请求(而非事务)相关的成功事件。这是有区别的。如果更改console.log(event.target.result)会怎么样代码>到控制台日志(事件)代码>?这些事件的内幕是什么?@Josh Thx,就是这样!