Web数据持久化存储IndexedDB(不常用)

图片 1.png)

function getData(){
     var tx = db.transaction("users");
     var store = tx.objectStore("users");
     var req = store.get("001");
     req.onsuccess = function (evt) {
          var res = evt.target.result;
          console.debug(res);
     };
     req.onerror = function (evt) {
          console.error("getData error:", evt.target.errorCode || evt.target.error);
     };
}

对象存储空间(ObjectStore)可以想象成关全面据库的表,在起始化DB触发onupgradeneeded时,创设ObjectStore。使用createObjectStore方法,第一个参数是目的名,第二个参数是目标属性,一般是安装keyPath(作为键使用)。

 

拔取工作可以一贯通过键摸索单个对象,而需要寻找五个对象时候就需要利用游标。游标是指向结果集的指针,不提前收集结果。游标指针会先指向结果中的第一项,在接收查找下一项命令时,才会针对下一项。

对象存储所有索引

总结

键范围由IDBKeyRange的实例表示。

图片 2

除去数据

当需要采用其他属性(非主键)获取数据时,就要优先成立索引,然后利用索引获取数据。

PS:图表来源->http://caniuse.com/#feat=indexeddb

以身作则下载:http://files.cnblogs.com/files/lovesong/IndexedDBdemo.zip

数据库开头化

浏览器匡助情形

     var DB_NAME = 'DEMO';
     var DB_VERSION = 2; //使用正整数,别用浮点型
     var db;

     function initDb() {
          console.debug("initDb ...");
          var req = indexedDB.open(DB_NAME, DB_VERSION);
          req.onsuccess = function (evt) {
               db = evt.target.result;
               console.debug("initDb opened");
          };
          req.onerror = function (evt) {
               console.error("initDb error:", evt.target.errorCode || evt.target.error);
          };

          //增加数据库版本号时,会触发onupgradeneeded事件(会在onsuccess之前被调用)
          req.onupgradeneeded = function (evt) {
               console.debug("initDb.onupgradeneeded");
          };
     }

本文为原创著作,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

  1. 只要需要修改或删除数据,就需要开辟成读写格局。

  2. cursor的非空校验是必备的。

  3. 修改或删除的操作也是有onsuccess和onerror的,只是在示范中从不写出来。

  4. 调用continue才会移动到下一项

效率如下:

正文地址 :http://www.cnblogs.com/lovesong/p/5055384.html

游标查询

累加数据

率先个参数是索引名字,第二个参数是索引的习性的名字,第多个是一个options对象。一般是指定unique,设置索引是否唯一。

PS:这里要注意的是,数据库版本只会有最新一个,不会同时存在五个版本的同名数据库。

索引

function addData(){
     var users = [{
          id : '001',
          name : '刘亦菲',
          age : 18
     },{
          id : '002',
          name : '杨幂',
          age : 19
     }];

     var tx = db.transaction("users", READ_WRITE);
     var store = tx.objectStore("users");
     var i = 0, len = users.length;
     while(i < len){
          store.add(users[i++]);
     }
}
function indexNames(){
     var tx = db.transaction("users", READ_WRITE);
    var store = tx.objectStore("users");
     var indexNames = store.indexNames;
     var index, i = 0, len = indexNames.length;
     while(i < len){
          index = store.index(indexNames[i++]);
          console.log(index);
     }
}

清空数据

装有读取或涂改数据的操作,都要经过业务来完成。成立工作使用transaction方法,第一个参数是内需拜访的ObjectStore,第二个参数是访问模式(readwrite、readonly,默认是只读)。

function indexGetData(){
     var tx = db.transaction("users", READ_WRITE);
     var store = tx.objectStore("users");
     var index = store.index("name");
     var req = index.get("杨幂")
     req.onsuccess = function (evt) {
          console.debug("indexGet success" , evt.target.result);
     };
     req.onerror = function (evt) {
          console.error("indexGet error:", evt.target.errorCode || evt.target.error);
     };
}

function indexOpenCursor(){
     var tx = db.transaction("users", READ_WRITE);
     var store = tx.objectStore("users");
     var index = store.index("name");
     var req = index.openCursor();
     req.onsuccess = function (evt) {
          var cursor = evt.target.result;
          if(cursor){ //必要检查
               var value = cursor.value;
               console.log(value);
               cursor.continue(); //移动到下一项
          }
     };
     req.onerror = function (evt) {
          console.error("openCursor error:", evt.target.errorCode || evt.target.error);
     };
}

上面由5个方面讲述:

IndexedDB保存的是目标,而不是使用表保存数据。打开数据库使用indexDB.open方法,这办法有五个参数,第一个是数据库名称,第二个是数据版本号。

     req.onupgradeneeded = function (evt) {
          console.debug("initDb.onupgradeneeded");
          var db = evt.currentTarget.result;
          //ObjectStore必须在onupgradeneeded里创建,其他地方将会创建失败
          var usersStore = db.createObjectStore("users", { keyPath : "id" });
     };

诸如学生、课程、分数六个表数据,想获悉某个学生的教程成绩,就得三个表连接,WebSQL分分钟信手拈来。可是如若你用IndexedDB,就得分两回搜索,先拿出分外学生,再拿出课程,然后再拿战表。

对象存储空间(ObjectStore)

  1. 数据库开端化

  2. 目的存储空间(ObjectStore)

  3. 事务

  4. 游标查询

  5. 索引

创制索引(在数据库初叶化onupgradeneeded事件时)

此地有几点要小心:

图片 3

usersStore.createIndex("name", "name", { unique : false });

获取数据

function delData(){
     var tx = db.transaction("users", READ_WRITE);
     var store = tx.objectStore("users");
     var req = store.delete("001");
     req.onsuccess = function (evt) {
          console.debug("delData success");
     };
     req.onerror = function (evt) {
          console.error("delData error:", evt.target.errorCode || evt.target.error);
     };
} 

目录获取数据

修改数据

PS:IndexedDB的操作完全是异步举行的,每四次IndexedDB操作,都亟需注册onerror或onsuccess事件处理程序。

function updateData(){
     var tx = db.transaction("users", READ_WRITE);
     var store = tx.objectStore("users");
     var req = store.put({
          id : '001',
          name : '刘亦菲-小龙女',
          age : 18
     });
     req.onsuccess = function (evt) {
          console.debug("updateData success");
     };
     req.onerror = function (evt) {
          console.error("updateData error:", evt.target.errorCode || evt.target.error);
     };
}

游标方向

游标键范围

IndexedDB是在浏览器中保留结构化数据的一种数据库,为了替换WebSQL(标准已舍弃,但被广大补助)而产出。IndexedDB使用NoSQL的花样来操作数据库,保存和读取是JavaScript对象,同时还援助查询及追寻。

PS:索引用法跟普通取值和游标取值一样

next : 从第一项到结尾一项(默认)

prev : 从最终一项到第一项

其它可以设置游标的键范围和游标的自由化,即打开openCursor方法时可以传这三个参数(openCursor(键范围,方向)),第一个参数是object类型,第二个参数是字符串类型。

function clearData(){
     var tx = db.transaction("users", READ_WRITE);
     var store = tx.objectStore("users");
     var req = store.clear();
     req.onsuccess = function (evt) {
          console.debug("clearData success");
     };
     req.onerror = function (evt) {
          console.error("clearData error:", evt.target.errorCode || evt.target.error);
     };
}
IDBKeyRange.only('001');  //只想要键为001的结果
IDBKeyRange.lowerBound('002'); //从键为002开始,到最后
IDBKeyRange.lowerBound('002', true); //从键为002开始,但忽略002,到最后
IDBKeyRange.upperBound('002'); //从头开始,到键为002为止
IDBKeyRange.upperBound('002', true); //从头开始,到键为002为止,但忽略002
IDBKeyRange.bound('001', '005'); //从001开始,到为005为止
IDBKeyRange.bound('001', '005', true, true); //从001开始,到为005为止,但忽略001、005

如此这般看起来IndexedDB很蠢,那样就进来误区了,你干吗要如此去存你要显示的数额,NoSql就用NoSql东西,就直接以一个对象存学生战表,两遍搜索就行了。

在使用IndexedDB时候,有人可能会拿WebSQL来相比,然后发现IndexedDB不可以做表连接(因为根本未曾这东西),也就是要得知一个数码,可能得分五遍开展。

事务

function openCursor(){
     var tx = db.transaction("users", READ_WRITE);
     var store = tx.objectStore("users");
     var req = store.openCursor();
     req.onsuccess = function (evt) {
          var cursor = evt.target.result;
          if(cursor){ //必要检查
               var value = cursor.value;
               console.log(value);
               if(value.name == '杨幂'){
                    value.age = 16;
                    cursor.update(value); //修改数据(必须是读写模式)
               }
               if(value.name == '柳岩'){
                    cursor.delete();  //删除当前项
               }
               cursor.continue(); //移动到下一项
          }
     };
     req.onerror = function (evt) {
          console.error("openCursor error:", evt.target.errorCode || evt.target.error);
     };
}
网站地图xml地图