之前的文章(http://www.cnblogs.com/wzh2010/archive/2012/05/22/2514017.html)里面描述了HTML5 离线数据存储的Web SQL,一个基于SQLite 的离线数据库,不过W3C 的 WebDatabase 规范中说这份规范不再维护了,取而代之的是IndexDB,一个NoSQL类型的数据库。

Html5Rocks把他们的优缺点做了比对,IndexDB综合看来有如下优点:

允许快速索引和搜索的对象,所以在HTML5 的 web应用程序中, 你可以有效管理你的数据和高效率的读/写操作。

W3C主推的离线数据库类型,逐渐替代Web SQL类型数据库,更新效率高并不断完善。

工作在异步模式下执行每步操作。让你使用高效率的的JavaScript事件驱动模块

现在我们来尝试使用这个IndexDB:

1、初始化声明

             var dbName = "H5AppDB"; //数据库名称
var dbVersion = 2.0; //数据库版本
var tablename = "todo"; //表名

2、初始并实例化IndexDB数据上下文

  //定义一个IndexDB方法集合对象
var H5AppDB = {}; //实例化IndexDB数据上下文,这边根据浏览器类型来做选择
var indexedDB = window.indexedDB || window.webkitIndexedDB ||window.mozIndexedDB; if ('webkitIndexedDB' in window) {
window.IDBTransaction = window.webkitIDBTransaction;
window.IDBKeyRange = window.webkitIDBKeyRange;
} H5AppDB.indexedDB = {};
H5AppDB.indexedDB.db = null; //错误信息,打印日志
H5AppDB.indexedDB.onerror = function (e) {
log.debug(e);
};

3、打开数据库,初始化数据库,并创建存储对象

   H5AppDB.indexedDB.open = function () {

                 //初始IndexDB
var request = indexedDB.open(dbName, dbVersion); request.onsuccess = function (e) {
// Old api: var v = "2-beta";
log.debug("success to open DB: " + dbName);
H5AppDB.indexedDB.db = e.target.result;
var db = H5AppDB.indexedDB.db;
if (db.setVersion) {
console.log("in old setVersion: " + db.setVersion);
if (db.version != dbVersion) {
var req = db.setVersion(dbVersion);
req.onsuccess = function () {
if (db.objectStoreNames.contains(tablename)) {
db.deleteObjectStore(tablename);
}
var store = db.createObjectStore(tablename, { keyPath: "timeStamp" });//keyPath:主键,唯一性 var trans = req.result;
trans.oncomplete = function (e) {
console.log("== trans oncomplete ==");
H5AppDB.indexedDB.getAllTodoItems();
}
};
}
else {
H5AppDB.indexedDB.getAllTodoItems();
}
}
else {
H5AppDB.indexedDB.getAllTodoItems();
}
} //如果版本不一致,执行版本升级的操作
request.onupgradeneeded = function (e) {
log.debug("going to upgrade our DB!"); H5AppDB.indexedDB.db = e.target.result;
var db = H5AppDB.indexedDB.db;
if (db.objectStoreNames.contains(tablename)) {
db.deleteObjectStore(tablename);
} var store = db.createObjectStore(tablename, { keyPath: "timeStamp" });//NoSQL类型数据库中必须的主键,唯一性 H5AppDB.indexedDB.getAllTodoItems();
} request.onfailure = H5AppDB.indexedDB.onerror;
};

4、获取对象信息,并进行轮询读取,然后绑定到页面

   //、获取对象信息
H5AppDB.indexedDB.getAllTodoItems = function () { var todos = document.getElementById("todoItems");
todos.innerHTML = ""; var db = H5AppDB.indexedDB.db;
var trans = db.transaction([tablename], "readwrite");//通过事物开启对象
var store = trans.objectStore(tablename);//获取到对象的值 // Get everything in the store; var keyRange = IDBKeyRange.lowerBound(0);
var cursorRequest = store.openCursor(keyRange);//开启索引为0的表 cursorRequest.onsuccess = function (e) { var result = e.target.result; if (!!result == false)
return; renderTodo(result.value);
result.continue();//这边执行轮询读取
}; cursorRequest.onerror = H5AppDB.indexedDB.onerror;
}; //绑定数据
function renderTodo(row) {
var todos = document.getElementById("todoItems");
var li = document.createElement("li");
var a = document.createElement("a");
var t = document.createTextNode(row.text); a.addEventListener("click", function() {
H5AppDB.indexedDB.deleteTodo(row.timeStamp);
}, false); a.textContent = " [Delete]";
li.appendChild(t);
li.appendChild(a);
todos.appendChild(li);
};

效果如下:

5、添加数据对象

             //4、添加数据对象
H5AppDB.indexedDB.addTodo = function (todoText) {
var db = H5AppDB.indexedDB.db;
var trans = db.transaction([tablename], "readwrite");
var store = trans.objectStore(tablename); var newArray = new Array("wzh","374532"); //数据以对象形式保存,体现NoSQL类型数据库的灵活性
var data = {
"text": todoText,
"timeStamp": new Date().getTime(),
"obj":newArray
}; var request = store.put(data);//保存数据 request.onsuccess = function (e) {
H5AppDB.indexedDB.getAllTodoItems();
}; request.onerror = function (e) {
log.debug("Error Adding: ", e);
};
};
function addTodo() {
var todo = document.getElementById("todo");
H5AppDB.indexedDB.addTodo(todo.value);
todo.value = "";
}

可以随意添加BJson格式的对象,体现NoSQl类型数据库的优越性...

6、删除数据对象(根据主键删除)

             // 删除数据对象
H5AppDB.indexedDB.deleteTodo = function(id) {
var db = H5AppDB.indexedDB.db;
var trans = db.transaction([tablename], "readwrite");
var store = trans.objectStore(tablename); var request = store.delete(id);//根据主键来删除 request.onsuccess = function(e) { H5AppDB.indexedDB.getAllTodoItems();
alert("删除成功");
}; request.onerror = function(e) {
log.debug("Error Adding: ", e);
};
};

W3C已经停止了对Web SQL  的更新,会更加完善对Index的规范草案和标准,所以以后的HTML5应用,有用到离线端数据库这一块,建议优先考虑IndexDB...

本文源码

HTML5项目笔记10:使用HTML5 IndexDB设计离线数据库的更多相关文章

  1. 使用HTML5 WebDataBase设计离线数据库

    基于HTML5的Web DataBase 可以让你在浏览器中进行数据持久地存储管理和有效查询,假设你的离线应用程序有需要规范化的存储功能,那么使用Web DataBase,可以使你的应用程序无论是在离 ...

  2. HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器

    HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道 ...

  3. HTML5自学笔记[ 10 ]简单的购物车拖拽

    用html5拖拽功能实现了一个简单的购物车,样式简陋,得学学画画提高下审美了T^T: <!doctype html> <html> <head> <meta ...

  4. HTML5学习笔记五:html5表单

    表单是页面上非常重要的一块内容,用户可输入的大部分内容都是在表单元素中完成的,与后台的交互大多数也是通过点击表单中的按钮. 一.新增的元素和属性 1.新增属性: 1.1 form属性:页面中的任何元素 ...

  5. Head First HTML5 Programming笔记--chapter1 认识HTML5

    升级到HTML5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 //EN" "http://www.w3.org/TR/ ...

  6. HTML5学习笔记四:html5结构

    一.大纲:大纲即文档中各内容区块的结构编排 1. 显示编排内容区块:使用section等元素创建文档结构,每个内容区块使用标题(h1~h6,hgroup); 2. 隐式编排内容区块:根据页面所书写的各 ...

  7. HTML5基础——笔记

    HTML5基础——笔记 近几年来,互联网+.大数据.云计算‘物联网‘虚拟现实‘人工智能.机器学习.移动互联网等IT相关新名词.新概念层出不穷,相关产业发展如火如荼.互联网+移动互联网已经深入到人民日常 ...

  8. 10款html5开发工具,实用+好用

    利用HTML5工具不仅可以帮助设计师和开发者创建更具吸引力的网站,还能增加网站的可用性和可访问性.本文收集了10款HTML5开发工具让你在网页中搭建特效.动画.视频.音频等诸多功能,为你节省更多开发时 ...

  9. HTML5 学习笔记(一)——HTML5概要与新增标签

    目录 一.HTML5概要 1.1.为什么需要HTML5 1.2.什么是HTML5 1.3.HTML5现状及浏览器支持 1.4.HTML5特性 1.5.HTML5优点与缺点 1.5.1.优点 1.5.2 ...

随机推荐

  1. 【[NOI2016]区间】

    发现自己的离散化姿势一直有问题 今天终于掌握了正确的姿势 虽然这并不能阻挡我noip退役爆零的历史进程 还是先来看看离散化怎么写吧,我以前都是这么写的 for(std::set<int>: ...

  2. HDU 1017A Mathematical Curiosity (暴力统计特殊要求个数)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1017 A Mathematical Curiosity Time Limit: 2000/1000 M ...

  3. #warning Incomplete method implementation怎么修改?

    #warning Incomplete method implementation怎么修改?       各位朋友,我在做一个表格视图的例子,在tableview方法里总有几个warning:#war ...

  4. 自学安卓练习作品单词APP(1)-安卓的hello word与有道字典防爬虫破解

    1.前言 闲来无聊.手机每天又是都接触的东西.程序什么的最容易接触到.想到有些人说前后端都做就是全栈的说法.哦,你看html5全栈. 要我说多接触一些多有意思.天天写后端.还不是业务层.又不是什么高大 ...

  5. Asp.net MVC 自定义错误页面以及return HttpNotFound遇到的问题

    今天在处理mvc 项目404和500页面时,发现我以前比较喜欢用的Return HttpNotFound()没有跳转到我在webconfig中配置的自定义404页面,而且也不会去执行Global中的A ...

  6. df du sync

    df命令用来检查linux系统的磁盘空间占用情况 df [选项] -h:以容易理解的格式输出文件系统分区占用情况,如32KB,120MB,60GB -k:以KB大小单位输出文件系统分区占用情况 -m: ...

  7. C语言的乱七八糟

    Note For C Linux下C编程基础(gcc/gdb/make使用) 一.vi学习 二.初探emacs 三.gcc编译器 3.1 gcc所支持后缀名解释 后缀名 解释 后缀名 解释 .c C原 ...

  8. 关于Django中JsonResponse返回中文字典编码错误的解决方案

    解决方案:JsonResponse(data, json_dumps_params={'ensure_ascii':False}) ! data是需要渲染的字典 def master(request) ...

  9. Macbook下安装memcached

    参考文献: https://blog.csdn.net/weixin_41827162/article/details/82049520 感谢大佬 安装memcached需要Homebrew 注意点: ...

  10. sublime text 3安装 package control 插件的方法

    自动安装的方法 - 快捷键ctrl+` 或者View->Show Console,输入如下代码 import  urllib.request,os;pf='Package Control.sub ...