Web SQL Database实际上已经被废弃,而HTML5的支持的本地存储实际上变成了Local Storage和Session Storage与IndexedDB。Web Storage使用简单字符串键值对在本地存储数据,方便灵活,但是对于大量结构化数据存储力不从心,IndexedDB是为了能够在客户端存储大量的结构化数据,并且使用索引高效检索的API。

异步API

在IndexedDB大部分操作并不是我们常用的调用方法,返回结果的模式,而是请求——响应的模式,比如打开数据库的操作

var request=window.indexedDB.open('testDB');

这条指令并不会返回一个DB对象的句柄,我们得到的是一个IDBOpenDBRequest对象,而我们希望得到的DB对象在其result属性中,

这条指令请求的响应是一个 IDBDatabase对象,这就是IndexedDB对象,

除了result,IDBOpenDBRequest接口定义了几个重要属性

  • onerror: 请求失败的回调函数句柄

  • onsuccess:请求成功的回调函数句柄

  • onupgradeneeded:请求数据库版本变化句

创建数据库

刚才的语句已经展示了如何打开一个indexedDB数据库,调用indexedDB.open方法就可以创建或者打开一个indexedDB。看一个完整的处理

function openDB (name) {var request=window.indexedDB.open(name);request.οnerrοr=function(e){console.log('OPen Error!');};request.onsuccess=function(e){myDB.db=e.target.result;};}var myDB={name:'test',version:1,db:null};openDB(myDB.name);

代码中定义了一个myDB对象,在创建indexedDB request的成功毁掉函数中,把request获取的DB对象赋值给了myDB的db属性,这样就可以使用myDB.db来访问创建的indexedDB了。

version

我们注意到除了onerror和onsuccess,IDBOpenDBRequest还有一个类似回调函数句柄——onupgradeneeded。这个句柄在我们请求打开的数据库的版本号和已经存在的数据库版本号不一致的时候调用。

indexedDB.open()方法还有第二个可选参数,数据库版本号,数据库创建的时候默认版本号为1,当我们传入的版本号和数据库当前版本号不一致的时候onupgradeneeded就会被调用,当然我们不能试图打开比当前数据库版本低的version,否则调用的就是onerror了,修改一下刚才例子

function openDB (name,version) {var version=version || 1;var request=window.indexedDB.open(name,version);request.οnerrοr=function(e){console.log(e.currentTarget.error.message);};request.onsuccess=function(e){myDB.db=e.target.result;};request.onupgradeneeded=function(e){console.log('DB version changed to '+version);};}var myDB={name:'test',version:3,db:null};openDB(myDB.name,myDB.version);

由于刚才已经创建了版本为1的数据库,打开版本为3的时候,会在控制台输出:DB version changed to 3

关闭与删除数据库

关闭数据库可以直接调用数据库对象的close方法

function closeDB(db){db.close();}

删除数据库使用indexedDB对象的deleteDatabase方法

function deleteDB(name){indexedDB.deleteDatabase(name);}

简单调用

var myDB={name:'test',version:3,db:null};openDB(myDB.name,myDB.version);setTimeout(function(){closeDB(myDB.db);deleteDB(myDB.name);},500);

由于异步API愿意,不能保证能够在closeDB方法调用前获取db对象(实际上获取db对象也比执行一条语句慢得多),所以用了setTimeout延迟了一下。当然我们注意到每个indexedDB实例都有onclose回调函数句柄,用以数据库关闭的时候处理,有兴趣同学可以试试,原理很简单,不演示了。

object store

有了数据库后我们自然希望创建一个表用来存储数据,但indexedDB中没有表的概念,而是objectStore,一个数据库中可以包含多个objectStore,objectStore是一个灵活的数据结构,可以存放多种类型数据。也就是说一个objectStore相当于一张表,里面存储的每条数据和一个键相关联。

我们可以使用每条记录中的某个指定字段作为键值(keyPath),也可以使用自动生成的递增数字作为键值(keyGenerator),也可以不指定。选择键的类型不同,objectStore可以存储的数据结构也有差异

键类型 存储数据
不使用 任意值,但是没添加一条数据的时候需要指定键参数
keyPath Javascript对象,对象必须有一属性作为键值
keyGenerator 任意值
都使用 Javascript对象,如果对象中有keyPath指定的属性则不生成新的键值,如果没有自动生成递增键值,填充keyPath指定属性

事务

在对新数据库做任何事情之前,需要开始一个事务。事务中需要指定该事务跨越哪些object store。

事务具有三种模式

  1. 只读:read,不能修改数据库数据,可以并发执行

  2. 读写:readwrite,可以进行读写操作

  3. 版本变更:verionchange

var transaction=db.transaction([students','taecher']);  //打开一个事务,使用students 和teacher object store
var objectStore=transaction.objectStore('students'); //获取students object store

给object store添加数据

调用数据库实例的createObjectStore方法可以创建object store,方法有两个参数:store name和键类型。调用store的add方法添加数据。有了上面知识,我们可以向object store内添加数据了

keyPath

因为对新数据的操作都需要在transaction中进行,而transaction又要求指定object store,所以我们只能在创建数据库的时候初始化object store以供后面使用,这正是onupgradeneeded的一个重要作用,修改一下之前代码

function openDB (name,version) {var version=version || 1;var request=window.indexedDB.open(name,version);request.οnerrοr=function(e){console.log(e.currentTarget.error.message);};request.onsuccess=function(e){myDB.db=e.target.result;};request.onupgradeneeded=function(e){var db=e.target.result;if(!db.objectStoreNames.contains('students')){db.createObjectStore('students',{keyPath:"id"});}console.log('DB version changed to '+version);};}

这样在创建数据库的时候我们就为其添加了一个名为students的object store,准备一些数据以供添加

var students=[{ id:1001, name:"Byron", age:24 },{ id:1002, name:"Frank", age:30 },{ id:1003, name:"Aaron", age:26 }];
function addData(db,storeName){var transaction=db.transaction(storeName,'readwrite'); var store=transaction.objectStore(storeName); for(var i=0;i<students.length;i++){store.add(students[i]);}}openDB(myDB.name,myDB.version);setTimeout(function(){addData(myDB.db,'students');},1000);

这样我们就在students object store里添加了三条记录,以id为键,在chrome控制台看看效果

keyGenerate

function openDB (name,version) {var version=version || 1;var request=window.indexedDB.open(name,version);request.οnerrοr=function(e){console.log(e.currentTarget.error.message);};request.onsuccess=function(e){myDB.db=e.target.result;};request.onupgradeneeded=function(e){var db=e.target.result;if(!db.objectStoreNames.contains('students')){db.createObjectStore('students',{autoIncrement: true});}console.log('DB version changed to '+version);};}

剩下的两种方式有兴趣同学可以自己摸索一下了

查找数据

可以调用object store的get方法通过键获取数据,以使用keyPath做键为例

function getDataByKey(db,storeName,value){var transaction=db.transaction(storeName,'readwrite'); var store=transaction.objectStore(storeName); var request=store.get(value); request.onsuccess=function(e){ var student=e.target.result; console.log(student.name); };
}

更新数据

可以调用object store的put方法更新数据,会自动替换键值相同的记录,达到更新目的,没有相同的则添加,以使用keyPath做键为例

function updateDataByKey(db,storeName,value){var transaction=db.transaction(storeName,'readwrite'); var store=transaction.objectStore(storeName); var request=store.get(value); request.onsuccess=function(e){ var student=e.target.result; student.age=35;store.put(student); };
}

删除数据及object store

调用object store的delete方法根据键值删除记录

function deleteDataByKey(db,storeName,value){var transaction=db.transaction(storeName,'readwrite'); var store=transaction.objectStore(storeName); store.delete(value); }

调用object store的clear方法可以清空object store

function clearObjectStore(db,storeName){var transaction=db.transaction(storeName,'readwrite'); var store=transaction.objectStore(storeName); store.clear();
}

调用数据库实例的deleteObjectStore方法可以删除一个object store,这个就得在onupgradeneeded里面调用了

if(db.objectStoreNames.contains('students')){ db.deleteObjectStore('students');
}

HTML5 API详解(18):IndexedDB 本地存储相关推荐

  1. HTML5 API详解(9):大家都知道的 localStorage 本地存储

    提到本地存储localStorage就不得不提sessionStorage和cookie这两个.其中localStorage和sessionStorage可以合成称为web Storage. 这里比较 ...

  2. HTML5 API详解(3):为何网页上要增加Battery电池状态API

    手机自身的电源管理已经相当不错了,那为何网页上还要增加一个HTML5 Battery电池状态API呢? 随着HTML5以及CSS3技术支持与发展,以及手机越来越高性能带来的可行性.移动端的页面显然会越 ...

  3. HTML5 API详解(17):Web SQL DataBase本地数据库

    Web SQL Database是一个已经废弃的规范,但是鉴于除了IE和Firefox,其他浏览器都已经实现了Web SQL Database,并且它还具有一些HTML5 Storage所不具有的特性 ...

  4. HTML5 API详解(15):History 不刷新也可以实现网页跳转

    HTML4中的History API history这个东西大家应该都不陌生,我们经常使用history.back(-1)来实现后退功能,具体的属性和方法如下: 属性 length 历史的项数.Jav ...

  5. HTML5 API详解(11):Cache 应用程序缓存,这下离线也可以玩了

    Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本.缓存会根据进来的请求保存输出内容的副本:当下一个请求来到的时候,如果是相同的URL,缓 ...

  6. HTML5 API详解(16):web socket 全双工通信

    目前实时Web应用的实现方式,大部分是围绕轮询和其他服务器端推送技术展开的,其中最著名的是Comet.Comet技术可以让服务器主动以异步方式向客户端推送数据. 使用轮询时,浏览器定期发送HTTP请求 ...

  7. HTML5 API详解(14):Notification 实现桌面提醒

    桌面提醒功能可以在窗口隐藏甚至是浏览器最小化(不被激活)的情况下,依然可以对用户进行信息通信,采用的方式就是在电脑桌面的右下角弹出消息提示框.这样的一个功能可以使用在一些消息推送的场景下.不过,虽然h ...

  8. HTML5 API详解(10):sessionStorage 你用过吗?

    sessionStorage和localStorage大部分是相同的,包括功能和使用.功能上唯一的区别是:localStorage是本地长时间存储,不会因为窗口关闭而丢失存储的数据,而sessionS ...

  9. HTML5 API详解(5):Page Visibility API帮您省流量,提高体验

    页面可见性API可以让你知 道一个页面什么时候是隐藏的,什么时候是显示的.当页面被最小化或者被切换成后台标签页时,浏览器会触发一个 visibilitychange事件,告诉你用户已经看不到这个页面了 ...

最新文章

  1. OBYC PRY PRV
  2. SSE图像算法优化系列一:一段BGR2Y的SIMD代码解析。
  3. Machine Learning on Spark——统计基础(二)
  4. MySQL—查询某时间范围的数据
  5. Java 8 时间日期库的20个使用演示样例
  6. vb用数组方式快速导出MSFlexGrid表格数据到Excel表格中
  7. docker 安全性问题
  8. ggthemes包:丰富ggplot2的表现力
  9. 浅谈数据指标以及指标体系
  10. 免费杀毒软件真的能杀木马吗?
  11. 那些不回你微信的人都在看什么?
  12. 使用WIFI通讯,手机秒变单片机大屏显示器
  13. vue cli js css压缩方案
  14. dvdscr是什么意思?什么是dvdscr格式?
  15. Xmind软件 2020最新安装教程讲解
  16. 关于UWP中下载文件夹操作问题
  17. 一 Ebuy首页展示之导航栏
  18. 微型计算机原理中的mov,微机原理考试题目类型
  19. 发票摇奖数据汇总(数据行转列)
  20. Nginx获取客户端真实ip

热门文章

  1. 【热烈祝贺】我刊主编郑纬民教授荣获中国存储终身成就奖!
  2. 作者:寇纲(1975-),男,博士,西南财经大学工商管理学院教授、博士生导师、执行院长...
  3. 客座编辑:石勇(1956-),男,中国科学院大学经济与管理学院教授、博士生导师,发展中国家科学院院士...
  4. 作者:杨波,山东农业大学硕士生。
  5. 【云服务】云服务案例分析Quiz
  6. 数学建模及其算法概述
  7. 使用深度学习框架 Tensorflow 实现线性回归 (Linear Model)
  8. 领扣-1/167 两数之和 Two Sum MD
  9. myeclipse部署ssh项目工程
  10. 电子书包“翻转”课堂