In my last post I provided some more information about the structure of the Indexed DB database. Today, I will dive into code and tell you how to create, open and delete a database. There are some small differences between the browsers, but I will handle that at the specific parts of code.
The code I will show will be the Asynchronous implementation of the API. In my previous post I have said no browser does implement the synchronous API, but I was wrong. The IE 10 Preview 3 also implements the Synchronous implementation, but you should only use it in combination with web workers, because it freezes the UI if you don’t.
Initializing the Indexed DB API
First things first: the Indexed DB API is still in draft, so this means the unified Indexed DB property on the window element isn’t implemented yet. Every browser uses his on prefix to use the API, but we can assign this to the Indexed DB property. This gives us a way to us the Indexed DB on the same way.
Initializing the Firefox implementation
if (window.mozIndexedDB) {
window.indexedDB = window.mozIndexedDB;
window.IDBKeyRange = window.IDBKeyRange;
window.IDBTransaction = window.IDBTransaction;
}
Initializing the Chrome implementation
if (window.webkitIndexedDB) {
window.indexedDB = window.webkitIndexedDB;
window.IDBKeyRange = window.webkitIDBKeyRange;
window.IDBTransaction = window.webkitIDBTransaction;
}
Initializing the IE 10 Preview 3 implementation (You’ll need to be running the Windows 8 Developer Preview to run this)
if (window.msIndexedDB) {
window.indexedDB = window.msIndexedDB;
}
Initializing the IE prototype implementation
if (navigator.appName == 'Microsoft Internet Explorer') {
window.indexedDB = new ActiveXObject("SQLCE.Factory.4.0");
window.indexedDBSync = new ActiveXObject("SQLCE.FactorySync.4.0");
if (window.JSON) {
window.indexedDB.json = window.JSON;
window.indexedDBSync.json = window.JSON;
} else {
var jsonObject = {
parse: function (txt) {
if (txt === "[]") return [];
if (txt === "{}") return {};
throw { message: "Unrecognized JSON to parse: " + txt };
}
};
window.indexedDB.json = jsonObject;
window.indexedDBSync.json = jsonObject;
}
// Add some interface-level constants and methods.
window.IDBDatabaseException = {
UNKNOWN_ERR: 0,
NON_TRANSIENT_ERR: 1,
NOT_FOUND_ERR: 2,
CONSTRAINT_ERR: 3,
DATA_ERR: 4,
NOT_ALLOWED_ERR: 5,
SERIAL_ERR: 11,
RECOVERABLE_ERR: 21,
TRANSIENT_ERR: 31,
TIMEOUT_ERR: 32,
DEADLOCK_ERR: 33
};
window.IDBKeyRange = {
SINGLE: 0,
LEFT_OPEN: 1,
RIGHT_OPEN: 2,
LEFT_BOUND: 4,
RIGHT_BOUND: 8
};
window.IDBRequest = {
INITIAL: 0,
LOADING: 1,
DONE: 2
};
window.IDBTransaction = {
READ_ONLY: 0,
READ_WRITE: 1,
VERSION_CHANGE: 2
};
window.IDBKeyRange.only = function (value) {
return window.indexedDB.range.only(value);
};
window.IDBKeyRange.leftBound = function (bound, open) {
return window.indexedDB.range.leftBound(bound, open);
};
window.IDBKeyRange.rightBound = function (bound, open) {
return window.indexedDB.range.rightBound(bound, open);
};
window.IDBKeyRange.bound = function (left, right, openLeft, openRight) {
return window.indexedDB.range.bound(left, right, openLeft, openRight);
};
}
Creating and opening a database
Once we have our Indexed DB initialized, we can start the real thing. Creating a database. There is no specific method to create a new database, but when we call the open method, a database will be created if it doesn’t exists. After that a connection to the database will be opened. To open or create a database, the only thing you need is a name.
var dbreq = window.indexedDB.open(“database name”);
dbreq.onsuccess = function (event) {
var dbConnection;
// IE prototype Implementation
if (event.result) {
dbConnection = event.result;
}
//IE 10 Preview 3, Firefox & Chrome implementation
else {
dbConnection = dbreq.result;
}
}
dbreq.onerror = function (event) {
// Log or show the error message
}
Calling the open method, will return an IDBRequest object. On this object we can attach an onerror function and an onsuccess function. The onerror event will provide handling the error returned by the open function, here you can provide logging or error handling. In the onsuccess event, the database connection will be opened. We can now start using the database connection.
As you can see in code, IE prototype implementation is handling this on an other way then IE 10 Preview 3, Firefox and Chrome. In the IE prototype implementation we get the result (the database connection) out the parameter that is passed trough with the onsuccess function. For IE 10 Preview 3, Firefox and Chrome, we get the result from the IDBRequest object. This is the implementation that was defined by the W3C.
Deleting a database
Deleting the database will happen almost the same way as opening a database. You provide the name of the database you want to delete, and the database will get deleted. The error event will only be called when something goes wrong. Providing a database name that doesn’t exists, will not result in an error and the onsuccess function will get called.
var dbreq = window.indexedDB.deleteDatabase(“database name”);
dbreq.onsuccess = function (event) {
// Database deleted
}
dbreq.onerror = function (event) {
// Log or show the error message
}
Now we can create, open and delete a database. In one of my next posts, I will show you how you can create/change your database structure.