1.indexedDB简介
使用indexedDB之前,最好使用以下代码,兼容不同浏览器。
//数据库对象 window.indexedDB =window.indexedDB||window.webikitIndexedDB||window.mozIndexedDB||window.msIndexedDB; //数据库事务 window.IDBTransaction = window.IDBTransaction||window.webikitIDBTransaction||window.mozIDBTransaction||window.msIDBTransaction; //数据库查询条件 window.IDBKeyRange = window.IDBKeyRange||window.webkitIDBKeyRange||window.mozIDBKeyRange||window.msIDBKeyRange; //游标 window.IBDCursor = window.IBDCursor ||window.webkitIBDCursor ||window.mozIBDCursor ||window.msIBDCursor ;
2.数据库中常用的操作
2.1 创建及删除数据库
创建:
var dbCon = indexedDB.open(dbName,dbVersion); open()方法参数名为数据库名称和数据库版本。如果该数据库不存在,则会自动创建。 删除: var DBDeleteRequest = window.indexedDB.deleteDatabase("toDoList"); dbCon.onsuccess = function(e){//连接成功 idb = e.target.result; //你的操作 } dbCon.onerror= function(e){//连接失败 //你的操作 }
2.2 创建及删除对象仓库,相当于关系数据库中的表
indexedDB中的数据库操作必须要在事务中进行,事务分为三类:
只读事务,读写事务,版本更新事务。
对数据仓库只进行 读 操作,可以使用 只读事务。 readonly
添加 、修改、删除数据的操作必需要使用,读写事务。 readwrite
创建、删除数据仓库必须使用版本更新事务,设置数据库的新版本号。设置新的版本号之后再连接数据库时,回先出发 onupgradeneeded 事件 ,然后再出发 onsuccess数据库连接成功事件。
创建和删除数据仓库:
dbCon.onupgradeneeded = function(e){ console.log('连接升级!'); var libdb = e.target.result; libdb.createObjectStore('newBooks',{keyPath:'id',autoIncrement:true}); //createObjectStore()方法的两个参数分别为创建数据仓库的名称,以及一个对象包括数据仓库主键keyPath属性,以及主键是否自增长。 // libdb.deleteObjectStore('books'); //deleteObjectStore('books');删除数据仓库方法,参数为数据仓库名称 };
操作数据仓库:
创建事务:
var txn = idb.transaction(objectStoreName,mode);
第一个参数为操作中需要用到的数据仓库,如果只涉及一个,可以直接传递数据仓库名称字符串,如果涉及多个,则将其放入数组中,然后将数组传入,第二个参数为事务模式,只读事务为 readonly ,读写事务均为 readwrite.
var libtxn = idb.transaction('newBooks','readwrite');//创建事务 var libstore = libtxn.objectStore('newBooks');//获取数据仓库对象,也可以是数组 libstore.put({isbn:1001,title:'love',author:'Jim Jack'});//添加数据,若指定主键存在,则更新数据 libstore.add({isbn:1002,title:'family',author:'J.K Rolling'});//添加数据,若制定逐渐存在则插入失败 libstore.delete(key);//参数要删除数据的键 libstore.count();//数据仓库中共有多少个数据对象
所操作数据仓库不相关的事务可以同时执行,操作有相同数据仓库的两个事务,即使其中一个为只读事务也不能同时执行。
(两个都是只读事务应该可以同时执行。本人猜测~~~)
创建和删除索引:
在indexedDB数据库中,只能针对 被设为索引的属性值进行检索,不能针对没有被设为索引的属性值进行检索。
dbCon.onupgradeneeded = function(e){ console.log('连接升级!'); var libdb = e.target.result; var stroe = libdb.createObjectStore('newBooks',{keyPath:'id',autoIncrement:true}); //createObjectStore()方法的两个参数分别为创建数据仓库的名称,以及一个对象包括数据仓库主键keyPath属性,以及主键是否自增长。 var name = 'indexName'; //索引名称 var indexProp = 'id';//索引属性 var opts = { unique:false, multiEntry:false };//配置索引 var idx = stroe.createIndex(name,indexProp , opts); // stroe.deleteIndex("indexName");删除索引 };
游标:
先创建事务,获取数据仓库对象,然后使用对象仓库的 openCursor 方法 可以创建游标。
//此处略去创建事务,获取数据仓库对象的代码
var range = IDBKeyRange.bound();返回一个由一批数据的主键值组成的IDBKeyRange集合对象,当游标打开时,该集合中的主键值所指向的数据均被读取到游标中。 //IDBKeyRange.bound() 共有四个参数(低,高,低开集或闭集,高开集或闭集); // IDBKeyRange.lowerBound() 两个参数 (低,低开集或闭集); 大于某一值 // IDBKeyRange.upperBound() 两个参数 (高,高开集或闭集); 小于某一值 // IDBKeyRange.only() 等于某一值 var direction = 'next'; //指定游标读取方向 var req = store.openCursor(range,direction);//打开游标 req.onsuccess = function(){ //打开游标为异步处理,打开成功时响应onsuccess方法 var cursor = this.result; if(cursor){ showData(cursor.value); cursor.continue(); } }
复合索引是一个索引指定多个索引属性,与单个索引操作类似。