在HTML 5中,新增一种被称为indexedDB的数据库,该数据库是一种存储在客户端本地的NoSQL数据库。
window.indexedDB=window.indexedDB||window.webkitIndexedDB||window.mozIndexedDB||window.msIndexedDB;
window.IDBTransaction=window.IDBTransaction||wndow.webkitIDBTransaction||window.msIDBTransaction;
window.IDBKeyRange=window.IDBKeyRange||window.webkitIDBKeyRange||window.msIDBKeyTRange;
window.IDBCursor=window.IDBCursor||window.webkitIDBCursor||window.msIDBCursor;
一、连接数据库
function connectionDatabase()
{
var dbName='IndexedDBTest';//数据名
var dbVersion=20120603;//版本号
var idb;
var dbConnect=indexedDB.Open(dbName,dbVersion);//连接数据库
dbConnect.onsuccess=function(e){
idb=e.target.result;//返回一个IDBDatabase对象,代表连接成功的数据库对象。
};
dbConnect.οnerrοr=function(){ alert('数据库连接失败')};
}
二、数据表
在使用indexedDB数据库的时候,所有对于数据的操作都在一个事务内部执行。
事务分三种:只读事务、读写事务与版本更新事务。
对于创建数据表与索引的操作,我们只能在版本更新事务内部进行。因为在IndexedDB API中不允许数据库中的表在同一版本发生变化,所以当我们创建或删除表时,必须使用新的版本号来更新数据库的版本,以避免重复修改数据库结构。
dbConnect.onupgradeneeded=function(e){idb=e.target.result;}
监听数据连接的请求对象的onupgradeneeded事件,当连接数据库时发现指定的版本号大于数据库当前版本号时触发该事件,当该事件被触发时一个数据库的版本更新事务已经开启,同时数据的版本号已经被自动更新完毕。
3.创建数据表
var name='Users';//表名称
var optionalParameters={keyPath(主键值):'userId',autoIncrement(主键值是否自增):false}
var store=idb.createObjectStore(name,optionalParameters);//创建数据表
4.创建索引
IndexedDB数据库中的索引类似于关系型数据库中的索引,需要通过数据记录对象的某个属性值来创建。在IndexedDB数据库中,只能针对被设为索引的属性值进行检索,不能针对没有被设为索引的属性值进行检索。
var name='userNameIndex';//索引名称
var keyPath='userName';//表示记录中哪个属性创建索引
var optionalParameters={unique(唯一性):false(可以相同),multiEntry:false};
multiEntry:表示索引为一个数组,true:表示数组中的每一个元素都能作为索引,false:只能将整个数组的元素作为一个索引。
var idx=store.createIndex(name,keyPath,optionalParameters);//创建索引
5.事务
idb.transaction('数据表','事务模式{readnoly,readwrite}'); //开启事务
可以通过监听事务对象的oncomplet事件以及onabort事件并定义事件处理函数来定义事件结束或中止时所要执行的处理。
6.保存数据
var tx=idb.tansaction(['Users'],"readwrite");//开启事务
var store=tx.objectStore('Users');//objectStore方法获取事务对象的作用范围中的某个表。
var value={属性1:值,属性2:值,属性3:值};
var req=store.put(value);//put方法参数值为一个需要被保存到对象仓库中的对象。(异步执行)
我们可以通过监听请求对象的onsuccess事件与onerror事件。判断值是否插入成功。
7.获取数据
store.get(Index);get方法使用一个参数,代表所获取数据的主键值。返回一个IDBReuqest对象。可以通过onsuccess事件和onerror事件来监听获取是否成功。在onsuccess事件中通过this.result.属性值获取数据。
还可以根据索引获取数据 store.index(index)方法。
get()一次只能获取一条数据。但是通过游标的指定可以一次获取多条数据。
var range=IDBKeyRange.bound(lower,upper,lowerOpen,upperOpen);//返回一个由一批数据的主键值组成的IDBKeyRange集合对象。参数一代表最小主键值、参数二代表最大主键值、参数三可选参数布尔型false时表示包含的参数中指定的最小主键值、参数四可选参数布尔型false时标示包含的参数中指定的最大主键值。三四参数默认为false。
var range=IDBKeyRange.lowerBound(lower,lowerOpen);//返回一个由一批数据的主键值组成的IDBKeyRange集合对象,这批数据中所有数据的主键值均大于等于方法参数中指定的主键值。参数二值是否包含lower值所指定的参数。
var range=IDBKeyRange.upperBound(upper,upperOpen);//同理
var direction="next";//指定游标的读取方向,next(主键值升序排列)|nextunique(升序,主键值相等时读取第一条数据)|prev(降序排序)|pervunique(参考升序)
var req=store.openCursor(range,direction);
返回IDBRequest对象,可以通过监听onsuccess事件及onerror事件处理返回数据。当找到合适的数据时,可以使用cursor.update方法、delete()、continue()、操作数据。