作者:心叶
时间:2018-04-30 15:36

IndexedDB采用对象保存数据,和平时使用的关系型数据库的操作有比较大的区别,下面从简单使用出发来慢慢学习它。

第一步:打开数据库,关闭数据库和删除数据库。

var database,indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
var request = indexedDB.open("databaseName",1);
//下面注册回调方法
request.onerror = function(e) {console.log(e.target.errorCode);
};
request.onsuccess = function(e) {database = e.target.result;console.log('创建或打开数据库成功');
};
request.onupgradeneeded = function(e) {database = e.target.result;
};

最终返回的request是一个IDBOpenDBRequest对象,通过在其注册需要的回调方法来在其中提示错误或获取数据库连接对象。

其中需要注意的是,onsuccess和onupgradeneeded的区别在于,前者是成功回调,后者是在打开的数据库不是我们期望的最新版本时触发,简单的说触发只有二种情况:

1.数据库不存在,第一次建立时;

2.indexedDB.open的第二个参数高于现在的数据库版本号时。

indexedDB.open的第二个参数请始终使用整数,不要使用小数,可能会有问题,其次onupgradeneeded是我们唯一可以修改数据库结构(对象存储空间结构)的地方。

还有二个关于数据库的操作:

1.删除数据库:indexedDB.deleteDatabase("databaseName");

2.关闭数据库:database.close();

第二步:对象存储空间(类似表)。

对象存储空间就相当于关系型数据库里面的表,为了可以使用它,我们需要如下面这样来先定义它:

request.onupgradeneeded = function(e) {database = e.target.result;//创建一个对象存储空间,并且用username作为主键var store = database.createObjectStore("students",{keyPath:"username"});//另一种设置主键的方法//var store = database.createObjectStore("students",{autoIncrement:true});
};

第三步:事务。

创建对象存储空间之后,数据库中的增删改查都是通过事务transaction来完成的,在数据库对象上面调用transaction()方法就可以创建事务对象了。

上面第二步是设置对象存储空间,我们会发现最后返回了这个对象,通过这个对象,我们就可以存储这个"表"了,那如果后续我们不是创建的时候,如果想修改对象存储空间里面的数据的时候,如何获取这个对象滴,如下所示:

var transaction= database.transaction(["students"],'readwrite');
var store=transaction.objectStore("students");

transaction()中传入的第一个参数表示事务准备管理的对象存储空间,上面用的是数组,可以用很多个,用哪个下面第二行这样就取哪个,如果和这里一样就一个,也可以直接传递字符串;transaction()中传入的第二个参数为对该空间操作的方式,默认为readonly只读操作,代码中传入的是readwrite读写操作。
第二步和第三步例子里面返回的store其实是对象存储空间,操作'表'的方法就由它提供。

第四步:操作对象存储空间。

添加数据用的是add方法(调用的时候保证主键和需要更新的一样就会实现更新),下面是例子:

//需要添加进去的二条数据
const studentsData = [{username: "Alice",  age: 15, hobby: "绘画" },{ username: "Tom",  age: 12, hobby: "跳舞" }
];
//添加数据,重复添加会报错
store.add(studentsData[0]);
store.add(studentsData[1]);

余下的修改、获取和删除等类似,用一个例子给出,如下所示:

//添加数据,重复添加会更新原有数据
store.put(studentsData[0]);
//根据存储空间的键找到对应数据
var data=store.get('Tom');
//删除某一条记录
store.delete(key);
//删除存储空间全部记录
store.clear();

第五步:索引。

在indexedDB中有两种索引,一种是自增长的int值,一种是keyPath:自己指定索引列,下面说的是第二种keyPath。

request.onupgradeneeded = function(e) {database = e.target.result;store=db.createObjectStore('students',{keyPath: 'username'});store.createIndex('nameIndex','name',{unique:true});store.createIndex('ageIndex','age',{unique:false});
};

这样我们就创建了二个索引nameIndex和ageIndex。
createIndex方法的三个参数方便表示索引名称、索引属性字段名和索引属性值是否唯一。
我们知道索引存在的目的是迅速定位数据,提高搜索速度,接着我们来通过刚刚新建立的索引来获取数据。

//获取指定的索引
var index = store.index("nameIndex");
//获取数据
index.get('Tom').onsuccess=function(e){var student=e.target.result;
}

这样我们可以利用索引快速获取数据,name的索引是唯一的没问题,但是对于age索引只会取到第一个匹配值,要想得到所有age符合条件的值就需要使用游标了
第六步:游标。

如果你想遍历每个值,你可以使用游标,下面是例子代码:

var request=index.openCursor();
//var IDBKeyRange = window.IDBKeyRange ||window.webkitIDBKeyRange ||window.msIDBKeyRange;
//var request=index.openCursor(IDBKeyRange.only(26));
request.onsuccess=function(e){var cursor=e.target.result;//这里的判断是必须的,必须的,if也没有写错,不是whileif(cursor){var student=cursor.value;cursor.continue();}
}

这里还需要提一点的是,openCursor()或openKeyCursor()这个方法可以传递一个参数,实现对搜索进行筛选,具体有下面这些筛选方法:

1.IDBKeyRange.only(value):只获取指定数据;

2.IDBKeyRange.lowerBound(value,isOpen):获取最小是value的数据,第二个参数用来指示是否排除value值本身,也就是数学中的是否是开区间;

3.IDBKeyRange.upperBound(value,isOpen):和上面类似,用于获取最大值是value的数据;

4.IDBKeyRange.bound(value1,value2,isOpen1,isOpen2):参考上面的说明应该不言而喻了吧。

需要明白的是,这里的筛选范围,指的是index而言的,就是说索引用的是哪个,改索引建立指定的字段,该字段的值是坐标,是对它进行筛选。

例子代码:https://github.com/yelloxing/...

IndexedDB 索引数据库相关推荐

  1. 教你怎么玩indexedDB浏览器数据库,执行流程以及常见错误等等

    (小编最近在研究indexedDB数据库,在网上看的文档都有些不好理解,像小编这个接触过mySql,Oracle,SQL Server的人看了都是云里雾里的,所以决定自己写一篇关于indexedDB是 ...

  2. 前端三种本地存储方式+indexedDB浏览器数据库存储

    1.cookie存储: 特征:1.不同的浏览器存放的cookie位置不一样,也是不能通用的.2.cookie的存储是以域名形式进行区分的,不同的域下存储的cookie是独立的.3.我们可以设置cook ...

  3. python建立图片索引数据库,根据一段文字,找到存放在电脑上最匹配的图片

    python建立图片索引数据库,根据一段文字,找到存放在电脑上最匹配的图片 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!

  4. mysql联合索引数据库查询数据会变慢_如何定位并优化慢查询SQL以及联合索引和索引多的弊端...

    以下思路均以Mysql为例,不过SQL调优通用的 根据慢日志定位慢查询SQL: 使用show variables like '%quer%';主要查看slow_query_log,slow_query ...

  5. 数据挖掘(9-22):数据离散程度+数据清理+三大相关系数+数据库索引(数据库面试常问)+P值含义及理解

    1.衡量数据离散程度的统计量: 数据的离散程度即衡量一组数据的分散程度如何,其衡量的标准和方式有很多,而具体选择哪一种方式则需要依据实际的数据要求进行抉择. 首先针对不同的衡量方式的应用场景大体归纳如 ...

  6. 混合索引_数据库面试题:查询在什么情况下不?索引-数据库知识点

    查询在什么情况下不⾛索引 数据库面试题 ⾸先,我们可以说通过explain去排查⼀个慢查询,进⽽找到它的索引(参看第五题),当创建索引却不⾛索引时,我们就需要考虑到优化器的问题. 在⼀条单表查询语句真 ...

  7. oracle clustered索引,数据库表--index clustered table

    cluster指一个或多个表组成的组,这些表物理的存储在相同的数据块上,有相同聚簇键值的所有行相邻的物理存储.第一,多个表物理的存储在一起,多个表数据存储到同一个数据块上:第二,包含相同聚簇键值的所有 ...

  8. MySQL还是h5储存数据_h5中五大存储方式

    h5之前,存储主要是用cookies.cookies缺点有在请求头上带着数据,大小是4k之内.主Domain污染. 主要应用:购物车.客户登录 对于IE浏览器有UserData,大小是64k,只有IE ...

  9. 2021年前端岗位面试题 “二”(本人亲测)

    今年4月份在南京面试 大概三周的时间 面试了二十几家大 中 小型企业 收集了各种面试题 希望给还在面试的兄弟们一点帮助 共三套 null和undefined的区别  null :表示无值; undef ...

最新文章

  1. mysql 3.6.4_TOMCAT5+MYSQL5+JIRA3.6.4配置说明
  2. soap php 分开类,PHP SoapClient类型映射的行为有所不同
  3. go语言的map以及红黑树的map
  4. python--socket套接字/TCP
  5. 将Vba代码转换成Php代码,将这个Excel公式转换成VBA代码(函数)
  6. SQL 数据对比(case when in)
  7. 关于GPS数据跳动问题的解决方案
  8. JTAG接口针脚定义及含义
  9. 【数据库实验一】基础操作
  10. SSL基础:5:openssl常用选项说明
  11. 正弦定理c语言,正弦定理练习题
  12. MySQL数据备份与恢复及sql语句使用方法
  13. SECURITY:加密与解密,AIDE入侵检测系统,扫面与抓包
  14. 利用 Echarts 简单制作省份或区域地图步骤
  15. [CTF] 关于php代码审计的MD5类的练习
  16. html5+ 原生标题栏添加input 输入框
  17. LNMP 架构部署(附:部署 Discuz 社区论坛 Web 应用)
  18. Android AES加密解密
  19. java自动生成接口文档
  20. 惩戒翻倍对抗利率下行,宜信、达飞、恒昌与逃废债互撕

热门文章

  1. 我是一名Cisco爱好 者
  2. 为Delphi应用增加脚本支持
  3. java编程 反射类的使用
  4. Android MarsDaemon实现进程及Service常驻
  5. 在 Shell 脚本里使用数组
  6. python2.0_s12_day10_rabbitMQ使用介绍
  7. 【转】Python 代码调试技巧
  8. 科技公司高管职位知多少?(转)
  9. 在Linux和Windows下删除文件夹中包含的.svn文件的方法
  10. puppet 手册之puppet rsync 模块应用完整版