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. Week1——JavaEE

    本科目标 首先,对我来说自己想走的方向是JavaWeb后台开发,因此JavaEE对我来说也是比较重要的,想学好这门课.进一步巩固自己现有的基础知识,完善自己的项目经验,更加熟悉开发流程.在框架方面我还 ...

  2. oracle基础之游标的理解与使用

    关于游标,首先要知道游标的定义. 游标,是内存中的一款区域,用来存放select的结果集 游标用来处理从数据库中检索的多行记录(使用select语句).利用游标,程序可以逐个的处理和遍历一次索引返回的 ...

  3. winform界面开发-HTML内容编辑控件

    参照及推荐博客:伍华聪 http://www.cnblogs.com/wuhuacong/archive/2009/07/07/1518346.html http://www.cnblogs.com/ ...

  4. C# 字符串中特定字符判断

    /// <summary> /// 计算字符串中子串出现的次数 /// </summary> /// <param name="str">字符串 ...

  5. Docker相关连接

    docker-compose文档:https://docs.docker.com/compose/compose-file/ dockerfile文档:https://docs.docker.com/ ...

  6. django导入/导出原始数据

    1.使用dumpdata命令导出指定app对应数据库中的数据: python manage.py dumpdata your_app --indent 4  > your_app/fixture ...

  7. 安装SCOM Reporting Server

    在SQL群集计算机上可以安装SCOM Reporting Server. 1.运行SQL Server安装程序,选择 全新安装SQL Server,不能向已有的群集实例中添加Reporting Ser ...

  8. [转发]CPU个数、CPU核心数、CPU线程数

    我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之说,下面文本就来解释一下CPU的核心数与 ...

  9. 开闭原则(OCP)

    开闭原则具有理想主义的色彩,它是面向对象设计的终极目标.因此,针对开闭原则的实现方法,一直都有面向对象设计的大师费尽心机,研究开闭原则的实现方式.后面要提到的里氏代换原则(LSP).依赖倒转原则(DI ...

  10. python基本数据类型(容器)- tuple list dict set

    tuple list dict set统称为“容器” 1. 元组tuple 列表list: 1.1 同:元组( ).列表[ ] 都是有序的 1.2 异:元组不能修改,列表可以修改 1.3 注意⚠:如果 ...