HTML5 -- 浏览器数据缓存 -- indexedDB
IndexedDB是一种可以让你在用户的浏览器内持久化存储数据的方法,为web应用提供了丰富的查询功能,使我们的应用在在线和离线都能正常工作。
由于 IndexedDB 本身的规范还在持续演进中,当前的 IndexedDB 的实现还是使用浏览器前缀。在规范更加稳定之前,浏览器厂商对于标准 IndexedDB API 可能都会有不同的实现。但是一旦大家对规范达成共识的话,厂商就会不带前缀标记地进行实现。实际上一些实现已经移除了浏览器前缀:IE 10,Firefox 16 和 Chrome 24。
如果你希望在仍旧使用前缀的浏览器中测试你的代码, 可以使用下列代码:
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange
要注意的是使用前缀的实现可能会有问题,或者是实现的并不完整,也可能遵循的还是旧版的规范。因此不建议在生产环境中使用。我们更倾向于明确的不支持某一浏览器,而不是声称支持但是实际运行中却出问题:
function hasIndexedDB () {
if (!window.indexedDB) {
return true;
}
}
打开数据库:
// 打开我们的数据库
var request = window.indexedDB.open("MyTestDatabase");
indexedDB打开数据库的方法如上,必须进行request,indexedDB只有一个open方法,上面的代码表示打开了一个"MyTestDatabase"的数据库,该方法可以接受第二个参数:
// 打开我们的数据库,版本号为1
var request = window.indexedDB.open("MyTestDatabase", 1);
第二个参数的版本号为整数,当前打开的版本号不能比现有的版本号小,否则会报错。
几乎所有我们产生的请求我们在处理的时候首先要做的就是添加成功和失败处理函数:
var db;
request.onerror = function(event) {
// Do something with request.errorCode!
};
request.onsuccess = function(event) {
db = event.target.result;
// Do something with request.result!
};
request还有一个回掉方法:
request.onupgradeneeded = function(event) {
var _db = event.target.result;
// Do something with request.result!
};
onupgradeneeded方法是只有在版本号升级的情况下才会执行(如果当前版本号为1,当我们在打开open(storeName, 2)时,onupgradeneeded就会执行)。
下面是整个数据库的操作流程:
当我们创建一个新的数据表时,我们首先要在onupgradeneeded方法中创建表:
// 只有在onupgradeneeded方法中有效
var createObjectStore = function (db, storeName) {
if (!db.objectStoreNames.contains(storeName)) {
db.createObjectStore(storeName, {
keyPath: 'id',
autoIncrement: true
})
console.log("createObjectStore:" + storeName + ",成功!")
}
}
删除表:
// 删除Store(在onupgradeneeded里调用)
deleteObjectStore (db, storeName) {
console.log('deleteObjectStore')
if (db.objectStoreNames.contains(storeName)) {
db.deleteObjectStore(storeName)
console.log("deleteObjectStore:" + storeName + ",成功!")
}
}
表中添加数据:
var students: [
{ id: 1001, name: "Byron", age: 24 },
{ id: 1002, name: "Frank", age: 30 },
{ id: 1003, name: "Aaron", age: 26 },
{ id: 1004, name: "Casper", age: 26 }
]
// 添加数据方法 在onsuccess中执行
var addData = function (db, storeName) {
console.log('addData success')
let transaction = db.transaction(storeName, 'readwrite')
let store = transaction.objectStore(storeName)
let request = null for (let i = 0; i < students.length; i++) {
request = store.add(tstudents[i])
request.onerror = function () {
console.error('数据库已有该数据!')
}
request.onsuccess = function () {
console.log('添加成功')
}
}
}
注意,在执行addData方法的时候,要确保已执行createObjectStore方法,否则会报错。添加完之后浏览器显示:

查询数据:
// 查询数据(根据关键词keyValue)
var getDataByKey = function (db, storeName, keyValue) {
let transaction = db.transaction(storeName, 'readonly')
let store = transaction.objectStore(storeName) let request = store.get(keyValue)
request.onsuccess = function (e) {
let result = e.target.result
console.log(result)
}
}
更新数据:
// 更新数据
var updateDataByKey = function (db, storeName, keyValue) {
let transaction = db.transaction(storeName, 'readwrite')
let store = transaction.objectStore(storeName)
let request = store.get(keyValue)
request.onsuccess = function (e) {
let student = e.target.result
student.age = 35
store.put(student)
console.log(student)
}
}
删除数据:
// 删除数据
var deleteDataByKey = function (db, storeName, keyValue) {
let transaction = db.transaction(storeName, 'readwrite')
let store = transaction.objectStore(storeName)
let result = store.delete(keyValue)
result.onsuccess = function () {
console.log('删除成功')
}
result.onerror = function () {
console.log('删除失败')
}
}
清空表:
// 清空store
var clearObjectStore = function (db, storeName) {
let transaction = db.transaction(storeName, 'readwrite')
let store = transaction.objectStore(storeName)
let request = store.clear()
request.onsuccess = function () {
console.log('清空成功')
}
request.onerror = function () {
console.log('清空失败')
}
}
关闭数据库:
// 关闭database
var closeIDB = function (db) {
db.close()
console.log('关闭')
}
删除数据库:
// 删除database
var deleteIDB = function (db) {
console.log('删除')
window.indexedDB.deleteDatabase(db)
}
新增表(带索引):
// 新增Store--带索引(在onupgradeneeded里调用)
var createObjectStoreWidthIndex = function (db, storeName) {
if (!db.objectStoreNames.contains(storeName)) {
let store = db.createObjectStore(storeName, {
keyPath: 'id'
})
store.createIndex('nameIndex', 'name', {
unique: true
})
store.createIndex('ageIndex', 'age', {
unique: false
})
console.log("createObjectStore:" + storeName + ",成功!")
}
}
成功之后浏览器端显示:

获取数据的方法:
// 获取数据(根据索引)
var getDataByIndex = function (db, storeName) {
let transaction = db.transaction(storeName, 'readonly')
let store = transaction.objectStore(storeName)
let index = store.index('nameIndex')
index.get('Byron').onsuccess = function (e) {
let student = e.target.result
console.log(student)
}
}
// 使用游标
var fetchStoreByCursor = function (db, storeName) {
let transaction = db.transaction(storeName)
let store = transaction.objectStore(storeName)
let request = store.openCursor() // 查询全部
request.onsuccess = function (e) {
let cursor = e.target.result
if (cursor) {
let student = cursor.value
console.log(student)
cursor.continue()
}
}
}
// 索引与游标结合
var getDataByMultiple = function (db, storeName) {
// 指定游标范围
// IDBKeyRange.only(value):只获取指定数据
// IDBKeyRange.lowerBound(value,isOpen):获取比value大的数据(isOpen: true不包含value, false包含value)
// IDBKeyRange.upperBound(value,isOpen):获取比value小的数据(isOpen: true不包含value, false包含value)
// IDBKeyRange.bound(value1,value2,isOpen1,isOpen2)
let transaction = db.transaction(storeName)
let store = transaction.objectStore(storeName)
let index = store.index('ageIndex')
index.openCursor(IDBKeyRange.bound(24, 30, true, true)).onsuccess = function (e) {
let cursor = e.target.result
if (cursor) {
let s = cursor.value
console.log(s)
cursor.continue()
}
}
}
如果我们需要手动更新版本,我们先要将indexedDB关闭,然后再打开新版本的数据库:
var updataVersion = function (db, storeName, version) {
closeIDB(db)
console.log('更新版本', storeName, version)
openIDB(storeName, version)
}
HTML5 -- 浏览器数据缓存 -- indexedDB的更多相关文章
- 缓存 - 数据缓存 - IndexedDB - Dexie.js
Classes Dexie DexieError Collection and():Add JS based criteria to collection(向集合添加基于JS的条件) delete() ...
- h5 localStorage和sessionStorage浏览器数据缓存
sessionStorage 会话数据,localStorage 没有过期时间 两个的API基本都一样的 基本的使用 // 保存一个数据 sessionStorage.setItem('key', ' ...
- web开发人员须知的web缓存知识–将数据缓存到浏览器端Net实现
现实中,服务器在向浏览器发送的数据中,一部分数据是不经常更新的,如果能将这部分数据缓存到浏览器端,将会大大降低传输的数据,提高应用的性能.通过Expires策略,可以使用HTTP 协议定义的缓存机制将 ...
- 文件分片 浏览器文件大小限制 自定义请求头 在一个资源的加载进度停止之后被触发 arrayBuffer 异步 二进制数据缓存区
js 整数限制 浏览器文件大小限制 https://w3c.github.io/FileAPI/#dom-blob-arraybuffer https://developer.mozilla.org/ ...
- IE浏览器清除缓存及历史浏览数据
IE浏览器清除缓存方法如下: 打开IE浏览器,依次点击"工具-Internet选项-常规-删除",如下图所示, 有的时候发现你明明已经执行了删除,但是实际上还是有缓存数据,一般是因 ...
- 大型web系统数据缓存设计
1. 前言 在高访问量的web系统中,缓存几乎是离不开的:但是一个适当.高效的缓存方案设计却并不容易:所以接下来将讨论一下应用系统缓存的设计方面应该注意哪些东西,包括缓存的选型.常见缓存系统的特点和数 ...
- jQuery源码解读 - 数据缓存系统:jQuery.data
jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...
- jQuery1.9.1源码分析--数据缓存Data模块
jQuery1.9.1源码分析--数据缓存Data模块 阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(el ...
- jQuery源代码学习之六——jQuery数据缓存Data
一.jQuery数据缓存基本原理 jQuery数据缓存就两个全局Data对象,data_user以及data_priv; 这两个对象分别用于缓存用户自定义数据和内部数据: 以data_user为例,所 ...
随机推荐
- 5 使用ip代理池爬取糗事百科
从09年读本科开始学计算机以来,一直在迷茫中度过,很想学些东西,做些事情,却往往陷进一些技术细节而蹉跎时光.直到最近几个月,才明白程序员的意义并不是要搞清楚所有代码细节,而是要有更宏高的方向,要有更专 ...
- Android数据统计
开发效率可以用这些方式提升: 1 . 构建公用工具类,方便大家使用 2 . 使用开源的一些包,例如ORM思想的数据库等 3 . 可以很快的找到问题.开发中,找bug的时间,往往是很多的.我用的方法有3 ...
- 深入理解HashMap和concurrentHashMap
原文链接:https://segmentfault.com/a/1190000015726870 前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据. 本篇 ...
- c# 设计模式 之:抽象工厂
1.作用:抽象工厂的目的就是生产[产品族],之前讲的“工厂模式”的每一个factory只造一种产品,抽象工厂让一个factory造多个产品. uml类图: 代码实现: 抽象工厂代码: namespac ...
- 找工作笔试面试那些事儿(13)---操作系统常考知识点总结 ZZ 【操作系统】
http://blog.csdn.net/han_xiaoyang/article/details/11285485 上一节对数据库的知识做了一个小总结,实际找工作过程中,因为公司或单位侧重点不一样, ...
- MySQL 8.0复制性能的提升(翻译)
What’s New With MySQL Replication in MySQL 8.0 MySQL复制从问世到现在已经经历了多个年头,它的稳定性和可靠性也在稳步的提高.这是一个不停进化的过程,由 ...
- VS2013打开项目 提示Asp.net4.5未在web服务器上注册 F5运行 启动不来 权限
打一个补丁 http://blogs.msdn.com/b/webdev/archive/2014/11/11/dialog-box-may-be-displayed-to-users-when-op ...
- 关于memcpy的实现
今天去面试,面试官出了一个关于memcpy的函数原型的实现的问题,本来这个问题是很简单的,但是不知道当时怎么脑子一抽竟然写错了,真是”累觉不爱”了.感觉这份工作算是泡汤了,算了事情发生了,错过了也就错 ...
- Webpack知识汇总
介绍 webpack把任何一个文件都看成是一个模块,模块间可以相互依赖(require or import),webpack的功能就是把相互依赖的文件打包在一起.webpack本身只能处理原生的Jav ...
- ClassNotFoundException: INameEnvironment
springboot兼容jsp启动是报错,ClassNotFoundException: INameEnvironment 降低springboot版本即可,原版本1.5.10,降为1.5.2可使用