博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
indexedDB入门
阅读量:6352 次
发布时间:2019-06-22

本文共 4492 字,大约阅读时间需要 14 分钟。

概述

IndexedDB 是一个事务型数据库系统,类似于基于 SQL 的 RDBMS。 然而不同的是它使用固定列表,IndexedDB 是一个基于 JavaScript 的面向对象的数据库。

现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的大小不超过 4KB,且每次请求都会发送回服务器 LocalStorage 在 2.5MB 到 10MB 之间(各家浏览器不同),而且不提供搜索功能,不能建立自定义的索引。所以,需要一种新的解决方案,这就是 IndexedDB 诞生的背景

简单来说,IndexedDB 就是浏览器提供的本地数据库。

IndexedDB 具有以下特点

  • 键值对储存
  • 异步操作(避免锁死浏览器)
  • 支持事务
  • 同源限制(协议+域名+端口)
  • 存储空间大
  • 支持二进制存储(ArrayBuffer 对象和 Blob 对象,可存储文件数据)

基本概念

对比关系数据库 MySql 可以得到以下关系

  • 数据库:IDBDatabase
  • 表格:对象仓库(IDBObjectStore)
  • 行数据:对象仓库存储的一条数据
  • 索引:IDBindex,加速数据的检索(在对象仓库里面可为不同的键创建)
  • 事务:IDBTransaction
  • 操作请求:IDBRequest
  • IDBCursor:遍历对象存储空间和索引
  • IDBKeyRange:定义键的范围数据

基本操作

兼容性注意点

// 全局变量兼容性问题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;if (!window.indexedDB) {    window.alert(        "Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available."    );}

数据库操作

打开/新建数据库

var databaseName = "MyTestDatabase";var databaseVersion = 1;// 打开数据库var request = window.indexedDB.open(databaseName, databaseVersion);request.onsuccess = function(event) {    console.log("open success");};request.onerror = function(event) {    console.log("open fail");};request.onupgradeneeded = function(event) {};

window.indexedDB.open函数打开对应的数据库,如果没有该数据库就会新建。

新建数据库或者数据库版本大于当前版本会触发onupgradeneeded事件

数据库为什么会有版本?

因为数据库的数据解构可能会发生改变的,所以一般修改数据解构的操作在onupgradeneeded里面书写

删除数据库

window.indexedDB.deleteDatabase(databaseName);

对象仓库操作(表格操作)

创建和修改表格是修改数据库的数据解构,所以我把他们写在onupgradeneeded事件里

创建表格

request.onupgradeneeded = function(event) {    console.log("onupgradeneeded");    db = event.target.result;    // 创建仓库对象(创建表格)    // 这里我将主键设置为id    var objectStore = db.createObjectStore(objectStoreName, {        keyPath: "id",        autoIncrement: true    });};

删除表格

request.onupgradeneeded = function(event) {    console.log("onupgradeneeded");    db = event.target.result;    // 删除仓库对象(删除表格)    db.deleteObjectStore(objectStoreName);};

数据操作(行数据操作)

新增数据(增)

var databaseName = "MyTestDatabase";var databaseVersion = 1;var db;var objectStoreName = "objectStore1";var storeDatas = [    { id: "1", name: "张三", age: 18 },    { id: "2", name: "李四", age: 19 }];var request = window.indexedDB.open(databaseName, databaseVersion);request.onsuccess = function(event) {    console.log("open success");    db = event.target.result;    // 将数据保存到新建的对象仓库    var objectStore = db        .transaction([objectStoreName], "readwrite")        .objectStore(objectStoreName);    storeDatas.forEach(function(dataItem) {        // 添加一条数据        objectStore.add(dataItem);    });};

删除数据(删)

var databaseName = "MyTestDatabase";var databaseVersion = 1;var db;var objectStoreName = "objectStore1";var storeDatas = [    { id: "1", name: "张三", age: 18 },    { id: "2", name: "李四", age: 19 }];var request = window.indexedDB.open(databaseName, databaseVersion);request.onsuccess = function(event) {    console.log("open success");    db = event.target.result;    console.log("删除数据");    var req = db        .transaction([objectStoreName], "readwrite")        .objectStore(objectStoreName)        .delete("2"); // 这里的“2”指定的是主键的键值    req.onsuccess = function() {        console.log("删除成功");    };    req.onerror = function() {        console.log("删除失败");    };};

修改数据(改)

console.log("更新数据");var req = db    .transaction([objectStoreName], "readwrite")    .objectStore(objectStoreName)    .put({        id: "2",        name: "王五",        age: 17    }); // 将整条数据给替换req.onsuccess = function() {    console.log("更新成功");};req.onerror = function() {    console.log("更新失败");};

获取数据(查)

console.log("读取数据");var req = db    .transaction([objectStoreName], "readonly")    .objectStore(objectStoreName)    .get("1"); // 这里的“1”也是主键的键值req.onsuccess = function() {    console.log("获取成功");    console.log(req.result);};req.onerror = function() {    console.log("获取失败");};

通过指针对象遍历表格数据

console.log("遍历数据");var objectStore = db    .transaction([objectStoreName], "readonly")    .objectStore(objectStoreName);var count = 0;objectStore.openCursor().onsuccess = function(event) {    var cursor = event.target.result;    if (cursor) {        console.log(`第${++count}条数据为`);        console.log(cursor.value);        cursor.continue(); // 将指针移动下一个位置    } else {        console.log("没有更多数据");    }};

小结

indexedDB的API还是非常多的,这里只是简单介绍了最常用的几个操作(个人认为^_^)。

参考文档

转载地址:http://xomla.baihongyu.com/

你可能感兴趣的文章
Bootstrap3基础 thumbnail 圆角类型的div块
查看>>
Java面向对象练习题多态之字母表
查看>>
ember.js101 入门教程 第三课
查看>>
Shell脚步之监控iostat数据
查看>>
C语言 -- 折半查找小程序
查看>>
python正则-- re模块
查看>>
402. Remove K Digits - Medium
查看>>
arm汇编指令的条件码
查看>>
打印沙漏
查看>>
Tomcat集群的session共享
查看>>
Mac OS X Lion下配置Tomcat7
查看>>
ThinkSNS+ 基于 Laravel master 分支,从 1 到 0,再到 0.1
查看>>
iptables详解
查看>>
spring的使用《一》
查看>>
[操作系统作业]os实验三:进程的管道通信
查看>>
博文目录 | 杰瑞教育原创系列文章目录一览
查看>>
ORACLE OCP学习体验之三
查看>>
Shell编程变量
查看>>
Google Analytics的Gif请求数据解读
查看>>
运行及总结
查看>>