indexedDB 小结

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();
}
}

 复合索引是一个索引指定多个索引属性,与单个索引操作类似。

















你可能感兴趣的:(indexedDB 小结)