HTML5项目笔记10:使用HTML5 IndexDB设计离线数据库
之前的文章(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设计离线数据库的更多相关文章
- 使用HTML5 WebDataBase设计离线数据库
基于HTML5的Web DataBase 可以让你在浏览器中进行数据持久地存储管理和有效查询,假设你的离线应用程序有需要规范化的存储功能,那么使用Web DataBase,可以使你的应用程序无论是在离 ...
- HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器
HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道 ...
- HTML5自学笔记[ 10 ]简单的购物车拖拽
用html5拖拽功能实现了一个简单的购物车,样式简陋,得学学画画提高下审美了T^T: <!doctype html> <html> <head> <meta ...
- HTML5学习笔记五:html5表单
表单是页面上非常重要的一块内容,用户可输入的大部分内容都是在表单元素中完成的,与后台的交互大多数也是通过点击表单中的按钮. 一.新增的元素和属性 1.新增属性: 1.1 form属性:页面中的任何元素 ...
- Head First HTML5 Programming笔记--chapter1 认识HTML5
升级到HTML5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 //EN" "http://www.w3.org/TR/ ...
- HTML5学习笔记四:html5结构
一.大纲:大纲即文档中各内容区块的结构编排 1. 显示编排内容区块:使用section等元素创建文档结构,每个内容区块使用标题(h1~h6,hgroup); 2. 隐式编排内容区块:根据页面所书写的各 ...
- HTML5基础——笔记
HTML5基础——笔记 近几年来,互联网+.大数据.云计算‘物联网‘虚拟现实‘人工智能.机器学习.移动互联网等IT相关新名词.新概念层出不穷,相关产业发展如火如荼.互联网+移动互联网已经深入到人民日常 ...
- 10款html5开发工具,实用+好用
利用HTML5工具不仅可以帮助设计师和开发者创建更具吸引力的网站,还能增加网站的可用性和可访问性.本文收集了10款HTML5开发工具让你在网页中搭建特效.动画.视频.音频等诸多功能,为你节省更多开发时 ...
- HTML5 学习笔记(一)——HTML5概要与新增标签
目录 一.HTML5概要 1.1.为什么需要HTML5 1.2.什么是HTML5 1.3.HTML5现状及浏览器支持 1.4.HTML5特性 1.5.HTML5优点与缺点 1.5.1.优点 1.5.2 ...
随机推荐
- linux常用搜索文件命令
使用linux系统难免会忘记文件所在的位置,可以使用以下命令对系统中的文件进行搜索.搜索文件的命令为”find“:”locate“:”whereis“:”which“:”type“ 方法/步骤 ...
- oracle数据库恢复归档脚本
cat restorearch1.sh rman target / << EOFRUN {SET ARCHIVELOG DESTINATION TO '/archlog1/db2_arch ...
- PHP----练习------球队列表
题目:页面上有一个ul球队列表当鼠标移动到某个li上的时候改行背景颜色变红,当点击某个li的时候,让该li之前的所有li背景色变黄,之后的所有li背景色变蓝.自己不变色. <!DOCTYPE h ...
- 一段基于Redis-SortedSet的限流代码
[HttpGet] public async Task<ActionResult<string>> Get() { //限流周期:5秒 int period = 5; //周期 ...
- es6之类与对象
一.类的定义 class Parent{ constructor(name="mukewang"){ this.name=name; } } let v_parant=new Pa ...
- springboot+mybatis+shiro——shiro简介
转载:[一]shiro入门 之 Shiro简介 一.shiro介绍: 官方网址:http://shiro.apache.org/introduction.html,shiro的功能包括:认证.授权.加 ...
- iOS一个很好的内存检测工具
虽然Xcode提供了instrument来检测内存,但是使用起来怎么看都很麻烦.然后有一个很不错的内存泄露的检测工具MLeaksFinder,使用的话不需要注入任何代码,直接导入库就行了.出现泄露的时 ...
- CSS3-阴影参数基础
box-shadow 语法:text-shadow: x-shadow y-shadow distance color; 值 描述 x-shadow 必需.水平阴影的位置.允许负值. y-sha ...
- 大数据框架-YARN
YARN(Yet Another Resource Negotiator): 是一种新的 Hadoop 资源管理器 [ResourceManager:纯粹的调度器,基于应用程序对资源的需求进行调度的, ...
- Python模拟校园网登录
最近忙着实验室的项目,学习的时间相对较少.前一段时间刚开始接触python时,依葫芦画瓢照着写了一个爬虫,爬取了某个网站的图片.当看到一张张图片自动出现在电脑屏幕上时,有些小小成就感.我想大多数人开始 ...