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的更多相关文章

  1. 缓存 - 数据缓存 - IndexedDB - Dexie.js

    Classes Dexie DexieError Collection and():Add JS based criteria to collection(向集合添加基于JS的条件) delete() ...

  2. h5 localStorage和sessionStorage浏览器数据缓存

    sessionStorage 会话数据,localStorage 没有过期时间 两个的API基本都一样的 基本的使用 // 保存一个数据 sessionStorage.setItem('key', ' ...

  3. web开发人员须知的web缓存知识–将数据缓存到浏览器端Net实现

    现实中,服务器在向浏览器发送的数据中,一部分数据是不经常更新的,如果能将这部分数据缓存到浏览器端,将会大大降低传输的数据,提高应用的性能.通过Expires策略,可以使用HTTP 协议定义的缓存机制将 ...

  4. 文件分片 浏览器文件大小限制 自定义请求头 在一个资源的加载进度停止之后被触发 arrayBuffer 异步 二进制数据缓存区

    js 整数限制 浏览器文件大小限制 https://w3c.github.io/FileAPI/#dom-blob-arraybuffer https://developer.mozilla.org/ ...

  5. IE浏览器清除缓存及历史浏览数据

    IE浏览器清除缓存方法如下: 打开IE浏览器,依次点击"工具-Internet选项-常规-删除",如下图所示, 有的时候发现你明明已经执行了删除,但是实际上还是有缓存数据,一般是因 ...

  6. 大型web系统数据缓存设计

    1. 前言 在高访问量的web系统中,缓存几乎是离不开的:但是一个适当.高效的缓存方案设计却并不容易:所以接下来将讨论一下应用系统缓存的设计方面应该注意哪些东西,包括缓存的选型.常见缓存系统的特点和数 ...

  7. jQuery源码解读 - 数据缓存系统:jQuery.data

    jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...

  8. jQuery1.9.1源码分析--数据缓存Data模块

    jQuery1.9.1源码分析--数据缓存Data模块 阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(el ...

  9. jQuery源代码学习之六——jQuery数据缓存Data

    一.jQuery数据缓存基本原理 jQuery数据缓存就两个全局Data对象,data_user以及data_priv; 这两个对象分别用于缓存用户自定义数据和内部数据: 以data_user为例,所 ...

随机推荐

  1. 平均负载(Load average)

    load average 的含义平均负载(load average)是指系统的运行队列的平均利用率,也可以认为是可运行进程的平均数. top命令中load average显示的是最近1分钟.5分钟和1 ...

  2. 笔记:Xen虚拟机如何迁移到KVM上?

    众所周知如果是在Linux上使用虚拟化技术的话,就会有基于Xen Hypervisor部署一个系统的机会.因为基于内核的虚拟机(KVM:Kernel-Based Virtual Machine)已经逐 ...

  3. mysql那些招

    show table status mysql官方文档在 http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html 这里的rows行是 ...

  4. Access用OleDbParameter无法更新数据解决方案

    昨天遇到了一个非常郁闷的问题,这个问题我几乎花了一天的时间才找到了造成问题的症结并解决. 问题是这样,原本一个使用Sqlserver数 据库的系统,我要让它实现Access数据接口,即我可以很方便地把 ...

  5. svg压缩工具svgo安装使用

    svgo是基于node.js的插件,所以需要先安装node.js 1.安装完node.js后,打开node.js命令窗口,输入npm install -g svgo,安装成后会出现下边的内容 2.对s ...

  6. 无法执行程序。所执行的命令为 "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe" /noconfig /fullpaths @"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\b411ea32\b48a9fb\aun5r0xd.c

    解决方案 将应用程序池进程模型中的标识设为“LocalSystem”即可.

  7. collecitons.deque

    python队列,可以使用collections里面的deque,将列表当作队列使用. deque方法有: from collections import deque deque.append() d ...

  8. Django的模版引擎与模版使用

    Django的模版引擎与模版使用 模版引擎是模版响应的后端.模版指的是HTML.css,js等相关的文件.模版引擎是将这些表示层文件与数据相整合在一起,然后将整合后的数据给到响应类型判断采用一次性响应 ...

  9. xss实现获取内网ip

    前提得浏览器支持webRTC,测试的时候google浏览器测试成功,火狐浏览器不支持webRTC, 再在xss平台直接复制如下js代码: function form_ip(ip,port){ var ...

  10. numeric_limits<>函数

    因为比较有用,所以自己试验并且翻译了一下,很可能有错误,希望发现错误的朋友能给我留言纠正,谢谢! 有部分没有翻译,因为还没弄清楚到底什么作用 numeric_limits是模板类. 需要注意的是返回值 ...