日期:2014-05-16 浏览次数:20510 次
?随着firefox4正式版的推出,IndexedDB正式进入我们的视线。IndexedDB是HTML5-WebStorage的重要一环,是一种轻量级NOSQL数据库。相较之下,WebDataBase标准已经很长时间没有更新,大有被IndexedDB取代的意思。
?
Section 1:起步,得到Database引用
w3c为IndexedDB定义了很多接口,其中Database对象被定义为IDBDataBase。而得到IDBDataBase用的是工厂方法,即从IDBFactory中取得。浏览器对象中,实现了IDBFactory的只有indexedDB这个实例。
大家可以先看下IDBFactory和IDBDataBase接口的定义
interface IDBFactory { IDBRequest open (in DOMString name); IDBRequest deleteDatabase (in DOMString name); }; interface IDBDatabase : EventTarget { readonly attribute DOMString name; readonly attribute DOMString version; readonly attribute DOMStringList objectStoreNames; IDBObjectStore createObjectStore (in DOMString name, in optional Object optionalParameters) raises (IDBDatabaseException); IDBRequest deleteObjectStore (in DOMString name) raises (IDBDatabaseException); IDBVersionChangeRequest setVersion ([TreatNullAs=EmptyString] in DOMString version); IDBTransaction transaction (in any storeNames, in optional unsigned short mode) raises (IDBDatabaseException); void close (); attribute Function onabort; attribute Function onerror; attribute Function onversionchange; }; interface IDBRequest : EventTarget { readonly attribute any result get raises (IDBDatabaseException); readonly attribute unsigned short errorCode get raises (IDBDatabaseException); readonly attribute Object source; readonly attribute IDBTransaction transaction; const unsigned short LOADING = 1; const unsigned short DONE = 2; readonly attribute unsigned short readyState; attribute Function onsuccess; attribute Function onerror; };
?
重要:IndexedDB中,几乎所有的操作都是采用了command->request->result的方式。比如查询一条记录,返回一个request,在request的result中得到查询结果。又比如打开数据库,返回一个request,在request的result中得到返回的数据库引用。
?
从IDBFactory的方法体定义中可以看到,返回了一个IDBRequest对象。这个IDBRequest就是刚才所说的request。
?
下面给出一个通用的得到IDBDataBase的方法
?
if (!window.indexedDB) { window.indexedDB = window.mozIndexedDB || window.webkitIndexedDB; } var request = indexedDB.open("MyTestDatabase"); request.onsuccess = function(e) { // Obtain IDBDatabase // VERSION_CHANGE transaction callback var db = request.result; }
?
Firefox4中使用IndexedDB的注意点:
1.indexedDB这个实例并不叫indexedDB,而是叫mozIndexedDB
2.indexedDB无法在iframe或者frame标签中使用
3.Firefox4中并未实现deleteDatabase方法(可能会在新版本中改进)
4.indexedDB.open并不能简单的看成是打开数据库,而是在打开数据库的基础上启动了一个version_change事件方法回调。在这个回调方法里自动启动了一个事务,用于version_change。IDBDatabase对象必须要在这个事务中才能取得。
?
?
Section 2:初始化object store
indexedDB标准建议,在初始化的时候创建表。以后每次打开浏览器,只需要check版本号。不需要第二次创建。而表在indexedDB中被称为object store。
下面给出object store接口的定义:
interface IDBObjectStore { readonly attribute DOMString name; readonly attribute DOMString keyPath; readonly attribute DOMStringList indexNames; readonly attribute IDBTransaction transaction; IDBRequest put (in any value, in optional any key) raises (IDBDatabaseException, DOMException); IDBRequest add (in any value, in optional any key) raises (IDBDatabaseException, DOMException); IDBRequest delete (in any key) raises (IDBDatabaseException); IDBRequest get (in any key) raises (IDBDatabaseException); IDBRequest clear () raises (IDBDatabaseException); IDBRequest openCursor (in optional any range, in optional unsigned short direction) raises (IDBDatabaseException); IDBIndex createIndex (in DOMString name, in DOMString keyPath, in optional Object optionalParameters) raises (IDBDatabaseException); IDBIndex index (in DOMString name) raises (IDBDatab