当前,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>