欢迎!从2017年开始,将慢慢的不在xmind上写总结了,全部转到博客中!这里将不再随便写写,将继承在xmind的精神,继续前行!!!

html5 web IndexedDB使用详解(抄的仅作记录,详细的见案例)

当前,IndexedDB的规范尚未最终定稿,不同的浏览器厂商还是使用浏览器前缀实现IndexedDB API。基于Gecko内核的浏览器使用moz前缀,基于WebKit内核的浏览器使用webkit前缀。 
如果还希望使用window.indexedDB来判断浏览器是否支持IndexedDB数据库,则可以做下面的处理:

window.indexedDB=window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB;
  if(window.indexedDB){
    alert("您的浏览器支持IndexedDB数据库。");
  } else{
   alert("您的浏览器不支持IndexedDB数据库。");
  }

window.indexedDB对象只有一个open方法,用于打开指定的数据库,语法如下: 
request对象 = window.indexedDB.open(数据库名, 数据库版本号)

//1、打开或创建数据库
request=window.indexedDB.open('testDB','2.0');//参数为:数据库名和版本号;数据库存在,则打开它;否则创建。

request对象用于处理用户对数据库的操作请求。可以通过它定义操作成功和失败的处理函数。 
通过request.onsuccess可以指定操作成功的处理函数,方法如下: 
(注:request.result是执行指定操作的结果,例如,执行打开数据库的操作后,通过request.result可以获得打开数据库的实例。通过数据库实例可以访问数据库。)

//2、指定操作成功的处理函数(可以获得对象存储空间信息)
request.onsuccess=function(event){
    alert('打开成功!');
    mydb=request.result;
    //var len = mydb.objectStoreNames.length;                 //对象存储空间名的个数
    //var  name=mydb.objectStoreNames[i];                     //对象存储空间名
    /*******方法调用********************/
    get(mydb);
};

通过request.onerror可以指定操作失败的处理函数,方法如下:

//3、指定操作失败的处理函数
request.onerror=function(event){
    alert("打开失败,错误号:" + event.target.errorCode);
};

通过request.onupgradeneeded可以执行改变数据库结构的操作函数(包括创建对象存储空间),方法如下:

//4、onupgradeneeded事件在下列情况下被触发:数据库第一次被打开时;打开数据库时指定的版本号高于当前被持久化的数据库版本号。(可通过修改版本号触发该事件)
request.onupgradeneeded = function(event) {
    mydb=request.result;//获得数据库实例对象
    if(!mydb.objectStoreNames.contains("students")) {                   //判断对象存储空间名称是否已经存在
        var objectStore = mydb.createObjectStore("students", {keyPath: "id"});//创建students对象存储空间;指定keyPath选项为id(即主键为id)
        //对象存储空间students的列email上创建一个唯一索引email,可以创建多个索引。
        objectStore.createIndex("email",                                //索引名
                                "email",                                //创建索引的列(即keyPath,索引属性字段名)
                                { unique: true });                      //索引选项(索引属性值是否唯一:true or false)
    }
}

 游标

/**
 * 范围:
 *(1)匹配等于指定键值的记录:var range = IDBKeyRange.only(指定键值)
 *(2)匹配小于指定键值的记录:var range = IDBKeyRange.lowerBound(指定键值, 是否不包括指定键值)
 *(3)匹配大于指定键值的记录:var range = IDBKeyRange.upperBound(指定键值, 是否不包括指定键值)
 *(4)匹配指定范围内的记录:var range = IDBKeyRange.bound(下限键值,上限键值,是否不包括下限键值,是否不包括上限键值
 */
  例如:
// 只取得当前索引的值为110的数据  
IDBKeyRange.only("110");  
// 只取得当前索引的值大于110,并且不包括110的数据  
IDBKeyRange.lowerBound("110", true);  
// 只取得当前索引的值小于110,并且包括110的数据  
IDBKeyRange.upperBound("110", false);  
// 取得当前索引的值介于110和120之间,并且包括110,但不包括120的数据  
IDBKeyRange.bound("110", "120", false, true);  
/**
 * 顺序参数:
 * IDBCursor.NEXT,顺序循环;
 * IDBCursor.NEXT_NO_DUPLICATE,顺序循环且键值不重复;
 * IDBCursor.PREV,倒序循环;
 * IDBCursor.PREV _NO_DUPLICATE,倒序循环且键值不重复。
 */

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML5 - IndexedDB</title>
</head>
<body>
	<div>
		
	</div>
	
<script>
var db;  
var request;
var transaction;
var objectStore;//对象仓库
//1、检测;浏览器支持情况
window.indexedDB=window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB;
	if(window.indexedDB){
		//alert("您的浏览器支持IndexedDB数据库");
	}else{
		//alert("您的浏览器不支持IndexedDB数据库");
	}
//2、创建或者打开数据库
function createdb(dbName,n){
	request=indexedDB.open(dbName,n);//参数为:数据库名和版本号;数据库存在,则打开它;否则创建。
	console.log(request);
	/*console.log(request);
	 *这条指令并不会返回一个DB对象的句柄,我们得到的是一个IDBOpenDBRequest对象,而我们希望得到的DB对象在其result属性中
	 *除了result,IDBOpenDBRequest接口定义了几个重要属性
	 *onerror: 请求失败的回调函数句柄
	 *onsuccess:请求成功的回调函数句柄
	 *onupgradeneeded:请求数据库版本变化句柄
	 * 第一次打开数据库时,会先触发upgradeneeded事件,然后触发success事件。
	 */
	request.onerror = function (event) {  
           alert("打开数据库失败:"+event.target.message);  
    }  
    request.onsuccess = function (event) {  
        alert("打开数据库成功!");
        db=event.target.result;
        //获得数据库实例对象  或者db= request.result  
        //db.createObjectStore("table6", {keyPath: "userId",autoIncrement: true});
        //var  len = db.objectStoreNames.length;                 //对象存储空间名的个数
        //var  name=db.objectStoreNames[i];                     //对象存储空间名
        transaction = db.transaction(["table"], "readwrite"); //事务操作的对象存储空间名   //事务模式:'readwrite'可读写模式;READ_ONLY只读模式;VERSION_CHANGE版本升级模式; 
        objectStore = transaction.objectStore("table");//向info存储空间加入一个info对象,获得request对象用于处理用户对数据库的操作请求(同样拥有onerror,onupgradeneeded,onsuccess事件)
        /*
         *选择当前操作的对象空间 
         * */
    }   
    request.onupgradeneeded = function(event) {  
        alert("版本变化!");  
        db = event.target.result;
        if(!db.objectStoreNames.contains("table")) {//判断对象存储空间名称是否已经存在
            objectStore = db.createObjectStore("table", {keyPath: "id",autoIncrement: true});//创建info对象存储空间;指定keyPath选项为Id(即主键为Id)
           /* 
            *db.createObjectStore("table1", {keyPath: "userId",autoIncrement: true});
            *db.createObjectStore("table2", {keyPath: "userId",autoIncrement: true});
            *db.createObjectStore("table3", {keyPath: "userId",autoIncrement: true});
            *db.createObjectStore("table4", {keyPath: "userId",autoIncrement: true});
            *当然了。你可以一次性的在这里建立多个对象空间!!!!或者每次改变n。和对象空间的名字。之前创建的会存在。
            * 为什么在onupgradeneeded中创建呢
            * 原因:当dbName和n这两个参数中的任何一个发生变化。都会执行重新创建一遍对象空间,
            * 注意:当dbName,保持不变,n只能逐渐增加,假如你这次n=3.那么下次n=2.就会报错 打开数据库失败:
            * n!=0;
            * */
           //创建索引 
		    objectStore.createIndex("name","name",{ unique: true });
		    objectStore.createIndex("age","age",{ unique: false });
		                                               //索引名  
		                                               //创建索引的列(即keyPath,索引属性字段名)
	                                                   //索引选项(索引属性值是否唯一:true or false)
	        }
            /*注意啊:创建索引 要在创建 对象空间的时候
             * unique: true  实际效果:这个索引的内容是唯一的。没法出现重复的。。无法创建 两个(索引属性值)相同的内容
             */
       
    }
}

//3.关闭与删除数据库  这个没意思
function deletedb(dbName){  
    try{  
        request=indexedDB.deleteDatabase(dbName);  //删除数据库使用indexedDB对象的deleteDatabase方法
        request.onerror = function () {  
            alert("删除数据库失败:"+event.target.message);  
        }  
        request.onsuccess = function (event) {  
            alert("删除数据库成功!"+dbName);  
        }   
    }catch(e){  
       alert(e.getMessage);  
    }  
}
//实践:不同页面创建的数据库。都会看见!!!所以 测试的时候 删除还点用的;
//deletedb('testDB');//注意啊  这里要带引号
//deletedb('user');
function closedb(db){
	db.close();
	//关闭数据库可以直接调用数据库对象的close方法
}
//4、插入数据
function insertdb(db,objectStoreName,argument){//这个是复杂的。第一个参数库名。第二个参数 相当于表名。第三个参数要穿的信息
	request=indexedDB.open(db);
	request.onsuccess = function (event) {
		db=event.target.result;
		transaction = db.transaction([objectStoreName], "readwrite");  
	    objectStore = transaction.objectStore(objectStoreName);
//	    transaction = db.transaction(["table"], "readwrite");  
//	    objectStore = transaction.objectStore("table");  固定死哪一个表;        
	    //objectStore.add(argument);  //使用add方法 此方法是异步的 有success和error事件:
	    var add = objectStore.add(argument)//从新定义add 是为了用onsuccess,objectStore.add(argument);也一样添加
	    add.onsuccess = function(e){
	    	alert("添加成功!"); 
	    }
	}
    
}
//5、查询数据 get()方法用来读取数据,它的参数是键名
function getdb(db,objectStoreName,id){
	request=indexedDB.open(db);
	request.onsuccess = function (event) {
		db=event.target.result;
		transaction = db.transaction([objectStoreName], "readwrite");  
	    objectStore = transaction.objectStore(objectStoreName);
	    var getmess = objectStore.get(id);
	    getmess.onsuccess = function(e){
	    	var message = e.target.result;
	    	//alert(JSON.stringify(message))
	    	alert(message.name);
	    }
	}
}
//6、更新数据 put()方法用来更新数据,貌似需要和get结合使用
function putdb(db,objectStoreName,id){
	request=indexedDB.open(db);
	request.onsuccess = function (event) {
		db=event.target.result;
		transaction = db.transaction([objectStoreName], "readwrite");  
	    objectStore = transaction.objectStore(objectStoreName);
	    var getmess = objectStore.get(id);
	    getmess.onsuccess = function(e){
	    	var message = e.target.result;//这是数据
	    	//在这查到数据后 重新赋值 或者 加个 整条信息的参数mes,message = mes 整条替换
	    	message.name = "李倩";
	    	objectStore.put(message)//把更换后的数据 更新
	    }
	}
}
//7、删除数据delete()方法用来删除数据,它的参数是键名  ||调用objectstore的clear方法可以清空objectstore
function deleteMess(db,objectStoreName,id){
	request=indexedDB.open(db);
	request.onsuccess = function (event) {
		db=event.target.result;
		transaction = db.transaction([objectStoreName], "readwrite");  
	    objectStore = transaction.objectStore(objectStoreName);
	    var deletemess = objectStore.delete(id);
	    deletemess.onsuccess = function(e){
	    	alert("删除成功!"); 
	    }
	}
}
//8、清空数据表中的信息    调用objectstore 用clear方法
function storeClear(db,objectStoreName){
	request=indexedDB.open(db);
	request.onsuccess = function (event) {
		db=event.target.result;
		transaction = db.transaction([objectStoreName], "readwrite");  
	    objectStore = transaction.objectStore(objectStoreName);
	    objectStore.clear();
	}
}
//9、删除 数据表 数据库实例的deleteObjectStore方法可以删除一个object store,这个就得在onupgradeneeded里面调用了
//10、利用索引查询
function searIndex(){
	request=indexedDB.open('jituan',3);
	request.onsuccess = function (event) {
		db=event.target.result;
		transaction = db.transaction(["table"], "readwrite");  
	    objectStore = transaction.objectStore("table");
	    var index = objectStore.index("name");//索引名  这里直接用index 会报错。要先创建索引
	    var request=index.get('刘大大');//通过 索引值 获取数据
	    request.onsuccess = function(e){
	    	var mess=e.target.result;  //查到要找的数据
	    	alert(JSON.stringify(mess))
	    }
	}
}
//11、使用游标 查询(查所有   年龄为25 的数据)
//function openCursor(){
//	request=indexedDB.open('user',2);
//	request.onsuccess = function (event) {
//		db=event.target.result;
//		transaction = db.transaction(["table"], "readwrite");  
//	    objectStore = transaction.objectStore("table");
//	    // 设置索引 ()
//	    var index = objectStore.index("age");//这里的索引注意 一定是创建数据库的时候存在的!!!!!!
//	    var ranges =IDBKeyRange.bound("10", "120", false, true); //设置查询条件
//	    //打开游标 objectStore.openCursor();里边的带查询参数
//	    var cursor=objectStore.openCursor(ranges);// 条件 放进游标中。
//	    cursor.onsuccess = function(event){
//	    	cursorMessage = event.target.result;
//	    	console.log(cursorMessage);
//	    	if(cursorMessage){
//	    		var neirong = cursorMessage.value;
//	    		console.log(neirong.name)
//	    		cursor.continue();
//	    	}
//	    }
//	}
//}

//-------------------------------------------------实验--------------------------------------
//alert(1);
//创建个叫集团的数据库 jituan
//createdb('user',2);
//deletedb('jituan')

    /*上传案例 用法
     * var argument ={
		name:"刘dage",  
        age:20,  
        xb:"男"  
	};
	insertdb('jituan','table',argument); 
     * */
    var argument ={
		name:"龙王2",  
        age:20,  
        xb:"女"  
	};
	var mes={name:"李倩",age:"15",xb:"男"}
    //insertdb('user','table',argument);
	//getdb('jituan','table',5);
	//putdb('jituan','table',5); 
	//deletedb('jituan','table',3); 
	//storeClear('user','info')
	//deleteObjectStore('user','info')
    openCursor();
</script>
</body>
</html>

  

posted @ 2016-11-03 15:54  拐进web的奋斗者  阅读(1418)  评论(0编辑  收藏  举报