Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check if IndexedDB objectStore already contains key

Adding an object to an IndexedDB objectStore will fail if the key already exists. How can I check for the existence of an object with a given key – preferably synchronously (no reason for another layer of callbacks) and without pulling the object.

I know how to do get requests asynchronously via transactions, but it seems a bit of an ordeal to go through every time I want to add an object.

note Solution only has to work in Chrome (if that helps)

like image 970
Chris Avatar asked Mar 09 '13 02:03

Chris


Video Answer


2 Answers

The best way to check existence of a key is objectStore.count(key). Which is async.

In your case, the best option is openCursor of your key. If exists, cursor will come up.

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)
  }
};
like image 178
Kyaw Tun Avatar answered Nov 07 '22 10:11

Kyaw Tun


So far none of the browsers have the sync API implemented so you're going to have to do it async. An objectStore exposes a get method which you provide it with a key and it'll return you the object (or null) that matches the key.

There's a really good tutorial on MDN that covers using IDB, and getting a record is covered too, but the inlined code is:

db.transaction("customers").objectStore("customers").get("444-44-4444").onsuccess = function(event) {
  alert("Name for SSN 444-44-4444 is " + event.target.result.name);
};

If you don't want retrieve the record then you can always used the count method on an index as explained here in the spec. Based on the result of that you can either use add or put to modify the record, it'll save extracting the record if you don't need to.

like image 37
Aaron Powell Avatar answered Nov 07 '22 08:11

Aaron Powell