如果键已存在,则将对象添加到 IndexedDB objectStore 将失败。我如何使用给定的键检查对象的存在——最好是同步的(没有理由需要另一层回调)并且不拉动对象。
我知道如何通过事务异步获取请求,但每次我想添加一个对象时似乎有点考验。
note解决方案只需要在 Chrome 中工作(如果有帮助的话)
如果键已存在,则将对象添加到 IndexedDB objectStore 将失败。我如何使用给定的键检查对象的存在——最好是同步的(没有理由需要另一层回调)并且不拉动对象。
我知道如何通过事务异步获取请求,但每次我想添加一个对象时似乎有点考验。
note解决方案只需要在 Chrome 中工作(如果有帮助的话)
检查密钥是否存在的最佳方法是 objectStore.count(key)。这是异步的。
在您的情况下,最好的选择是您的密钥的 openCursor 。如果存在,光标会出现。
var req = objectStore.openCursor(key);
req.onsuccess = function(e) {
var cursor = e.target.result;
if (cursor) { // key already exist
cursor.update(obj);
} else { // key not exist
objectStore.add(obj)
}
};
到目前为止,所有浏览器都没有实现同步 API,因此您将不得不异步进行。AnobjectStore
公开了一个get
方法,您为它提供了一个键,它将返回与该键匹配的对象(或 null)。
MDN 上有一个非常好的教程,其中涵盖了使用 IDB,也涵盖了获取记录,但内联代码是:
db.transaction("customers").objectStore("customers").get("444-44-4444").onsuccess = function(event) {
alert("Name for SSN 444-44-4444 is " + event.target.result.name);
};
如果您不想检索记录,那么您始终可以按照规范中的count
说明在索引上使用该方法。根据您可以使用或修改记录的结果,如果您不需要,它将保存提取记录。add
put
问题是你为什么想知道这个?也许你应该使用另一种方法?
你可以使用自动增量,这样你就不需要检查一个键是否存在,你总是会得到一个唯一的。
您也可以使用 put 方法而不是 add 方法。如果键存在,则使用 put 更新数据,如果键不存在,则添加数据。
一切都取决于您要检查某物是否存在的原因。