摘要

在移动端H5页面开发的时候,为了更好的提高用户体验,可以对不常变化的数据做浏览器端数据缓存,在用户打开页面的时候,首先加载本地的数据,然后异步请求服务端,更新数据。在移动端webview中,可以使用IndexedDB的方式对数据进行存储。当然如果数据量不大的情况下,localstorage也是一种选择。

什么是IndexedDB

一般来说,数据库分两种类型:关系型和文档型(也称NoSQL或者对象)。关系型数据库如SQL Server,MySQL,Oracle的数据存储在表中。文档数据库如Mongodb,Redis,CouchDB将数据集作为个体对象存储。IndexedDB是一个文档数据库,它在完全内置于浏览器中的一个沙盒环境中(强制依照(浏览器)同源策略)。如下图所示,展示了数据库的结构:

关于Indexeddb的增删该查,可以使用这篇文字封装的插件进行使用。

http://www.codemag.com/Article/1411041

index.db.js

  1. //index.db.js
  2. ;
  3.  
  4. window.indexedDB = window.indexedDB ||
  5. window.mozIndexedDB ||
  6. window.webkitIndexedDB ||
  7. window.msIndexedDB;
  8.  
  9. window.IDBTransaction = window.IDBTransaction ||
  10. window.webkitIDBTransaction ||
  11. window.msIDBTransaction;
  12.  
  13. window.IDBKeyRange = window.IDBKeyRange ||
  14. window.webkitIDBKeyRange ||
  15. window.msIDBKeyRange;
  16.  
  17. (function (window) {
  18.  
  19. 'use strict';
  20.  
  21. var db = {
  22.  
  23. version: 1, // important: only use whole numbers!
  24.  
  25. objectStoreName: 'tasks',
  26.  
  27. instance: {},
  28.  
  29. upgrade: function (e) {
  30.  
  31. var
  32. _db = e.target.result,
  33. names = _db.objectStoreNames,
  34. name = db.objectStoreName;
  35.  
  36. if (!names.contains(name)) {
  37.  
  38. _db.createObjectStore(
  39. name,
  40. {
  41. keyPath: 'id',
  42. autoIncrement: true
  43. });
  44. }
  45. },
  46.  
  47. errorHandler: function (error) {
  48. window.alert('error: ' + error.target.code);
  49. debugger;
  50. },
  51.  
  52. open: function (callback) {
  53.  
  54. var request = window.indexedDB.open(
  55. db.objectStoreName, db.version);
  56.  
  57. request.onerror = db.errorHandler;
  58.  
  59. request.onupgradeneeded = db.upgrade;
  60.  
  61. request.onsuccess = function (e) {
  62.  
  63. db.instance = request.result;
  64.  
  65. db.instance.onerror =
  66. db.errorHandler;
  67.  
  68. callback();
  69. };
  70. },
  71.  
  72. getObjectStore: function (mode) {
  73.  
  74. var txn, store;
  75.  
  76. mode = mode || 'readonly';
  77.  
  78. txn = db.instance.transaction(
  79. [db.objectStoreName], mode);
  80.  
  81. store = txn.objectStore(
  82. db.objectStoreName);
  83.  
  84. return store;
  85. },
  86.  
  87. save: function (data, callback) {
  88.  
  89. db.open(function () {
  90.  
  91. var store, request,
  92. mode = 'readwrite';
  93.  
  94. store = db.getObjectStore(mode),
  95.  
  96. request = data.id ?
  97. store.put(data) :
  98. store.add(data);
  99.  
  100. request.onsuccess = callback;
  101. });
  102. },
  103.  
  104. getAll: function (callback) {
  105.  
  106. db.open(function () {
  107.  
  108. var
  109. store = db.getObjectStore(),
  110. cursor = store.openCursor(),
  111. data = [];
  112.  
  113. cursor.onsuccess = function (e) {
  114.  
  115. var result = e.target.result;
  116.  
  117. if (result &&
  118. result !== null) {
  119.  
  120. data.push(result.value);
  121. result.continue();
  122.  
  123. } else {
  124.  
  125. callback(data);
  126. }
  127. };
  128.  
  129. });
  130. },
  131.  
  132. get: function (id, callback) {
  133.  
  134. id = parseInt(id);
  135.  
  136. db.open(function () {
  137.  
  138. var
  139. store = db.getObjectStore(),
  140. request = store.get(id);
  141.  
  142. request.onsuccess = function (e) {
  143. callback(e.target.result);
  144. };
  145. });
  146. },
  147.  
  148. 'delete': function (id, callback) {
  149.  
  150. id = parseInt(id);
  151.  
  152. db.open(function () {
  153.  
  154. var
  155. mode = 'readwrite',
  156. store, request;
  157.  
  158. store = db.getObjectStore(mode);
  159.  
  160. request = store.delete(id);
  161.  
  162. request.onsuccess = callback;
  163. });
  164. },
  165.  
  166. deleteAll: function (callback) {
  167.  
  168. db.open(function () {
  169.  
  170. var mode, store, request;
  171.  
  172. mode = 'readwrite';
  173. store = db.getObjectStore(mode);
  174. request = store.clear();
  175.  
  176. request.onsuccess = callback;
  177. });
  178.  
  179. }
  180. };
  181.  
  182. window.app = window.app || {};
  183. window.app.db = db;
  184.  
  185. }(window));

index.db.js使用

设置数据库名称

  1. //indexed db name
  2. app.db.objectStoreName = "mytestdb";

添加数据

  1. //add data
  2. app.db.save({ id: 2, name: "wolfy" }, function () {
  3. //回调函数
  4. console.log("添加成功");
  5. });

查询数据

根据id查询

  1. //查询
  2. app.db.get(1, function (item) {
  3. console.log(item);
  4. });

查询所有

  1. //query all
  2. app.db.getAll(function (items) {
  3. console.log(items);
  4. });

结果

删除数据

删除id为2的数据

  1. //delete
  2. app.db.delete(2, function () {
  3. console.log('删除成功');
  4. })

删除所有

  1. app.db.deleteAll(function () {
  2. console.log("删除成功");
  3. })

修改

  1. //add data
  2. app.db.save({ id: 2, name: "wolfy2" }, function () {
  3. //回调函数
  4. console.log("添加成功");
  5. });

总结

在优化移动端h5页面的时候,对不经常变化的数据进行本地存储,在访问页面的时候先加载本地的然后异步更新本地数据。

参考资料

http://web.jobbole.com/81793/

http://www.codemag.com/Article/1411041

浏览器数据库IndexedDB介绍的更多相关文章

  1. 浏览器数据库 IndexedDB 入门

    一.概述 随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据. 现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的 ...

  2. 浏览器数据库 IndexedDB 入门教程

    一.概述 随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据. 现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的 ...

  3. 客户端持久化数据库---indexedDB使用

    _ 阅读目录 一:什么是indexedDB数据库? 二:IndexedDB数据库操作 2.1 打开或创建数据库 2.2 创建对象仓库(或叫创建表) 2.3 创建索引 2.4 新增数据 2.5 读取数据 ...

  4. MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

    本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下   数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...

  5. Postgres数据库基本介绍

    最近一直在做一个和PostgreSQL数据库相关的项目,把自己在这个过程中学习的知识记录下来.关于PostgreSQL数据库网上已经有太多的相关介绍了,为了博文的系统性还是先看一下维基百科对Postg ...

  6. [转]MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

    本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下   数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...

  7. Android SQLite 数据库详细介绍

    Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...

  8. iOS-SQLite数据库使用介绍

    iOS-SQLite数据库使用介绍 SQLite是MySQL的简化版,更多的运用与移动设备或小型设备上.SQLite的优点是具有可移植性,它不需要服务器就能运行,同时,它也存在一些缺陷,首先,没有提供 ...

  9. MySql数据库基本介绍和基本语法

    一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系统中,关系型数据库使用最为 ...

随机推荐

  1. mysql千万级表关联优化(2)

    概述: 交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上. 这个 ...

  2. shell在linux里摇摇晃晃

    1.shell不只是一种解释器,还是一种编程工具 查看系统中可用的shell,linux默认使用 Bash Shell [root@localhost ~]# cat /etc/shells /bin ...

  3. Ionic Js十六:滚动条

    ion-scroll ion-scroll 用于创建一个可滚动的容器. <ion-scroll [delegate-handle=""] [direction="& ...

  4. 数据挖掘算法:关联分析二(FP-tree算法)

    三.FP-tree算法 下面介绍一种使用了与Apriori完全不同的方法来发现频繁项集的算法FP-tree.FP-tree算法在过程中没有像Apriori一样产生候选集,而是采用了更为紧凑的数据结构组 ...

  5. Java8Lambda表达式

    “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个 ...

  6. 使用命令行管理virtualBox

    最近在鼓捣hadoop,装了几台虚拟机,,总感觉gui启动很别扭,后来发现virtualBox有个headless模式,只想说舒服! 常用命令 VBoxManage startvm name|id - ...

  7. 【转】让你10分钟搞定Mac--最简单快速的虚拟安装

    文章出处:让你10分钟搞定Mac--最简单快速的虚拟安装http://bbs.itheima.com/thread-106643-1-1.html (出处: 黑马程序员训练营论坛) 首先说明一下. 第 ...

  8. ssm框架常见问题

    搭建SSM框架时,总是遇到这样那样的问题,有的一眼就能看出来,有的需要经验的积累.现将自己搭建SSM框架时遇到的典型问题总结如下: 一.Struts2框架下的action中无法使用@Autowired ...

  9. CodeDom生成类文件

    仅供个人学习 需要先引入System.CodeDom nuget包 using CodeGenerate.Entities; using System; using System.CodeDom; u ...

  10. python opencv3 向图像里写字

    git:https://github.com/linyi0604/Computer-Vision # coding:utf-8 import cv2 img = cv2.imread(".. ...