IndexedDB usage guide

IndexedDB is the most updated web storage that can be used as a database similar to local storage. It was developed to solve some of local storage problems, mainly the limitation of 5MB storage and the synchronous execution. So yes, IndexedDB storage is unlimited and it’s API call is executed asynchronously.

IndexedDB accepts object as its data type.

The API guide

Just like local storage, IndexedDB is already implemented on most popular browsers like Chrome, Firefox and Safari. You can check if your current browser already support IndexedDB by running the following code on the console:

if (indexedDB) {
  window.alert('IndexedDB is ready for some action!');
} else {
  window.alert(
    "Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available."
  );
}

Create and open a database

IndexedDB use open method to create, open and connect to the database. It accepts two argument — the database name and version

let request = indexedDB.open('mydatabase', 1);

If you have no IndexedDB named mydatabase, it will be created and connected to your website. The open method returns an open db object that can be used to create object store, add, update and remove data. We’re going to use the returned object to first create object store, which is the name of the object holding all our data.

request.onerror = function(event) {
  // Handle errors.
};
request.onupgradeneeded = function(event) {
  var db = event.target.result;

  // the ObjectStore is just like a table in SQL type database
  // we can data as the object store property
  var objectStore = db.createObjectStore('developers');
  var objectStore = db.createObjectStore('designers');
};

Now we need to open transaction before we can add, update or remove data from the database

Opening transaction

An IndexedDB transaction lifetime is tied to the event loop, meaning if there is no further command issued after opening the transaction, it will close itself and you have to open another one. To keep transaction active, you have to issue another command immediately after opening.

transaction accepts 2 arguments: the array list of object store that can be accessed by the transaction and the optional permission. Permission defaults to read, so if you want to add, update or remove data, you can use readwrite permission.

You can then add new data by using the add method. It accepts 2 arguments: object type to store as data and string type as key.

var db = request.result;
var transaction = db.transaction(['developers'], 'readwrite');
var objectStore = transaction.objectStore('developers');

// add a new data to developers object store
objectStore.add({ name: 'Nathan', email: '[email protected]' }, 'dev01');

In Chrome, you can inspect the newly saved data from the Applications tab

You can also shorten the code above by chaining transaction and objectStore methods.

var objectStore = db
  .transaction(['developers'], 'readwrite')
  .objectStore('developers');

objectStore.add({ name: 'Andrew', email: '[email protected]' }, 'dev02');

Get saved data

Simply use the get method with the key as argument, like:

// you can also chain get or add with onsuccess event handler
db
  .transaction('developers')
  .objectStore('developers')
  .get('dev02')
  .onsuccess = function(event) {
  alert('Name for dev02 is ' + event.target.result.name);
};

Updating data

First, retrieve data using get, update data by simple property assignment, then use put method:

// you can also chain get or add with onsuccess event handler
var objectStore = db
  .transaction('developers', 'readwrite')
  .objectStore('developers');

objectStore.get('dev02').onsuccess = function(event) {
  var data = event.target.result;
  // change name
  data.name = 'Dean'; 
  objectStore.put(data, 'dev02').onsuccess = function(event) {
    // the data is updated. Do the next step required here
  };
};

If the data isn’t changed when you inspect it using the developer tool, try to hit the refresh button

Removing data

To delete saved data, simply use the delete method from objectStore object, which accepts key argument for deleting:

var request = db
  .transaction(['developers'], 'readwrite')
  .objectStore('developers')
  .delete('dev01');

request.onsuccess = function(event) {
  // data with key dev01 has been deleted!
};

Conclusion

IndexedDB is a great client side database for storing more complex data than local storage. But since users can request to wipe data, and even delete it from the browser console, it can’t be used as a source of truth for most complex use cases. Just like local storage, IndexedDB might be best used for quick experiment and prototyping. But then again, if you need to go through the trouble of learning IndexedDB operation, why not just learn server side database like MongoDB, Firebase or MySQL? For one, they can’t be inspected through browser console and deleted by users.

This summary is sourced from MDN’s IndexedDB documentation, so if you want to learn more, feel free to dig in that article.

Take your skills to the next level ⚡️

I'm sending out an occasional email with the latest tutorials on programming, web development, and statistics. Drop your email in the box below and I'll send new stuff straight into your inbox!

No spam. Unsubscribe anytime.