HTML5 的 Web SQL Database 用本地和会话存储实现简单的对象持久化,对繁琐的关系数据进行处理。

  在 W3C 的 Web SQL Database 规范中(参照 介绍)有这样的描述:Web SQL Database 引入了一套使用 SQL 来操纵客户端数据库(client-side database)的 API,这些 API 是异步的(asynchronous),所以作者在使用这套 API 时会发现匿名函数非常有用。

  Web SQL Database 规范中定义的三个核心方法:

  1、openDatabase:这个方法使用现有数据库或创建新数据库创建数据库对象。

  2、transaction:这个方法允许我们根据情况控制事务提交或回滚。

  3、executeSql:这个方法用于执行真实的SQL查询

  

打开数据库

  openDatabase方法可以打开已经存在的数据库,不存在则创建:

  var db = openDatabase('mydatabase', '1.0', my db', 2 * 1024);

  openDatabasek中五个参数分别为:数据库名、版本号、描述、数据库大小、创建回调。创建回调没有也可以创建数据库。

  ·下面是网上一段很有用的封装的数据库创建方法

function initDB(){
 var myDB = null;
    try {
        if (!window.openDatabase) {
            // 当前浏览器没有数据库支持
            alert('db not supported');
        } else {
            var shortName = 'testdb';
            var version = '1.0';
            var displayName = 'test offline database';
            var maxSize = 65536; // 字节
            myDB = openDatabase(shortName, version, displayName, maxSize);
        }
    } catch(e) {
        // 这里开始异常处理 .
        if (e == INVALID_STATE_ERR) {
            // 数据库版本异常 .
            alert("Invalid database version.");
        } else {
            alert("Unknown error "+e+".");
        }
    }
    // 返回创建好的数据库实例
    return myDB;
 }

执行数据库语句  

  所有 SQL 语句的执行都被嵌套在一个事务中,从而保证了数据的完整性和一致性。执行该 SQL 语句的结果以及错误处理需要在 executeSql 函数的最后两个参数中指定,这两个回调方法参数是可以省略的。

  

  var sql1 = 'CREATE TABLE IF NOT EXISTS User(name TEXT, age INTEGER);'

  var sql2 = 'INSERT INTO User values(?,?)';

  var sql3 = 'SELECT * FROM User WHERE name=?';

  var sql4 = 'DELETE FROM User where name=?';
  
  var sql5 = 'UPDATE User SET age=? WHERE name=?'; 

  myDB.transaction(function (tx) {
        tx.executeSql(sql,['参数'],function(tx,results){

      var len = results.rows.length;
          var result = results.rows.item(0).name

    },function(tx,error){

    });
    });

persistence.js 

  所有的 SQL 操作都需要在指定的函数中做结果处理以及错误处理,而且传统的 SQL 语句写起来也比较费事,这个时候我们都无比怀念 Java 语言中的 ORM 工具。

所幸的是开发社区从来不缺有创意的开发人员,目前已经有不少的开源 Web SQL ORM 工具出现了。

  persistence.js 是一个 JavaScript 框架,最初它的设计目标是对 HTML Web SQL 进行 OR Mapping,以方便客户端开发人员进行快速的 Web SQL 访问。

后来随着该框架的发展,它开始逐渐剥离了对数据库的依赖,成为一个可以支持各种数据库的框架。

  (1)引入 persistence.js

  persistence.js 将其核心模块分割成各个较小的 JavaScript 文件,有效的保证了高性能的加载,用户仅需要在用到某个功能模块时才引入相应的 JavaScript 文件。这里我们用到了 persistence.js,persistence.store.sql.js 和 persistence.store.websql.js,这三个文件是使用 Web SQL 必需的。如果用户想以在内存中临时保存数据的方式作为浏览器不支持 Web SQL API 时的替代,那么也可以将 persistence.store.memory.js 引入进来。

  <script type="text/javascript" src="js/persistence.js"></script>

  <script type="text/javascript" src="js/persistence.store.sql.js"></script>

  <script type="text/javascript" src="js/persistence.store.websql.js"></script>

  <script type="text/javascript" src="js/persistence.store.memory.js"></script>

  文件下载地址https://github.com/coresmart/persistencejs

  (2)插入和删除数据

    对 User 表插入一条记录就是直接将一个 User 对象保存起来,并调用 flush() 方法在持久化。

     persistence.js 插入数据
   var mark = new User({name: "Mark", age: 60});
   persistence.add(mark);
   persistence.flush();

   删除一条记录就是直接将一个 User 对象删除,如清单 10。

    persistence.js 删除数据
   persistence.remove(mark);
   persistence.flush();

  (3)对表之间关联的支持

    传统的数据库支持一对多,多对一,多对多的表间关联,这部分功能在很多 Java ORM 工具中已经很好的支持了,在 persistence.js 中,也能发现类似的实现。比如上例中的 User 表,我们需要加入一个新的 Address 表记录 User 对象的地址,每个 User   对象可能有多个地址。我们可以轻易实现表的关联。

var Address = persistence.define('Address', {
 detail: "TEXT",
 zipcode: "TEXT"
 });
 User.hasMany(“addresses”, Address, “user”);
 persistence.schemaSync();
 var addr1 = new Address({detail:”addr1”, zipcode:”code1”});
 var addr2 = new Address({detail:”addr2”, zipcode:”code2”});
 persistence.add(addr1);
 persistence.add(addr2);
 mark.addresses.add(addr1);
 mark.addresses.add(addr2);
 persistence.flush();

    hasMany() 方法是每个通过 persistence.define 定义出的对象都有的内置方法,通过执行上述 hasMany() 方法,User 表将会增加一个属性 addresses 作为与 Address 表的关联,并且 addresses 可以关联到多个 Address 对象。而 Address 对象也会  增加一个 user 属性,通过 user 属性将某个 Address 对象关联到一个 User 对象。

    类似的,用户也可以调用表对象的 hasOne() 方法来定义 Address 对象仅关联到一个 User 对象。

  (4)查询数据

    persistence.js 提供了简单而强大的查询语法,查询数据是仅需要相当直观的一两次 API 调用。针对某个表的查询入口实际上就是从 persistence.define 定义出的对象入手。以上文定义的 User 为例。

    User.all() 将会直接返回一个 QueryCollection,里面将包含所有的 User 对象。

    User.load() 可以根据用户传入的 User 对象 ID 来加载某个 User 对象。

    User.findBy() 可以根据用户传入的 User 对象属性以及属性的值来查询出符合条件的 User 对象集合并返回。

   
   User.all().one(function(user){
     console.log(user);
   }); // 查询出第一个 User 对象

   User.load("6C22FD66801C41728AE5A6BCE0A8EE54", function(user){
     console.log(user.name);
   }); // 查询出 ID 为"6C22FD66801C41728AE5A6BCE0A8EE54"的 User 对象

   User.findBy("name", "Mark", function(user){
     console.log(user.age);
   }); // 查询出 name 是 Mark 的 User 对象

  针对查询返回的 QueryCollection,persistence.js 提供了丰富的扩展性功能来整理该集合中的数据,如 filter,or,and,order,limit 等等,感兴趣的读者可以在 persistence.js 的官网上找到相关介绍。

  然而!!!

  

  这他喵的就有点尴尬了。

  W3C组织在2010年11月18日废弃了webSql。但是并不影响其当前功能的使用,依然很强悍,使用者不在少数。

基于HTML5 的WebSql本地设备数据库的更多相关文章

  1. 基于HTML5的Web跨设备超声波通信方案

    前言:Chirp在iPhone上掀起了有声传输文件的序幕,我们再也不需要彩信.蓝牙配对.IM来传送数据.它通过“叽叽喳喳”的小鸟叫声来分享数据,简单有趣,而且可以快速的实现一对多的分享. 此外支付宝曾 ...

  2. HTML5本地存储和本地的数据库

    一个网站如何能在客户的浏览器存储更多的数据呢? 在Html4的时代在浏览器端存储点网站个性化的数据,尤其是用户浏览器的痕迹,用户的相关数据等一般只能存储在Cookie中,但是大多是浏览器对于Cooki ...

  3. 基于Html5的移动端开发框架的研究

    下面统计信息部分来自网络,不代表个人观点.请大家参考.         基于Html5移动端开发框架调查                                   序号 框架 简介 优点 缺 ...

  4. 基于 HTML5 的数据存储

    以前想做个静态网页APP.最初的思路是用本地文件存储数据,后来发现在手机上运行时,文件无法找到. 经过了长达几个月的搜索(实际也就几天),没有找到合适的方法. 就在绝望的时候,无意间搜到基于HTML5 ...

  5. 基于Html5的移动端APP开发框架

    快速增长的APP应用软件市场,以及智能手机的普及,手机应用:Native(原生)APP快速占领了APP市场,成为了APP开发的主流,但其平台的不通用性,开发成本高,多版本开发等问题,一直困扰着专业AP ...

  6. 基于HTML5的Web SCADA工控移动应用

    在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在 ...

  7. 基于HTML5移动web应用

    一.基于HTML5移动web应用 1.canvas 绘图 2.多媒体 3.本地存储 4.离线应用 5.使用地理位置 6.移动web框架   二.具体说明 1.HTML5标准最大的变化就是支持Web绘图 ...

  8. 快速开发基于 HTML5 网络拓扑图应用

    采用 HT 开发网络拓扑图非常容易,例如<入门手册>的第一个小例子麻雀虽小五脏俱全:http://www.hightopo.com/guide/guide/core/beginners/e ...

  9. 基于HTML5技术的电力3D监控应用(二)

    上篇介绍了我们电力项目的基本情况,我们选用HTML5技术还是顶着很大压力,毕竟HTML5技术性能行不行,浏览器兼容性会不会有问题,这些在项目选型阶段还是充满疑惑,项目做到现在终于快收尾了我们才敢松口气 ...

随机推荐

  1. spring mvc页面显示图片失败

    在配置文件中需要映射静态资源 <!-- 当在web.xml 中 DispatcherServlet使用 <url-pattern>/</url-pattern> 映射时, ...

  2. Mysql 免安装版 root@localhost第一次密码设置

    方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass ...

  3. C++11多线程std::thread的简单使用

    在cocos2dx 2.0时代,我们使用的是pthread库,是一套用户级线程库,被广泛地使用在跨平台应用上.但在cocos2dx 3.0中并未发现有pthread的支持文件,原来c++11中已经拥有 ...

  4. 关于CachedRowSetImpl类

    全称: com.sun.rowset.CachedRowSetImpl 父类: javax.sql.rowset.BaseRowSet 实现的接口: javax.sql.RowSet javax.sq ...

  5. 双色球机选算法java实现

    双色球机选算法java实现 一.代码 package com.hdwang; import java.util.Random; /** * Created by admin on 2017/1/10. ...

  6. struts2框架学习(二)

    ---恢复内容开始--- 一.搭建步奏 1.新建web项目,进行必备Jar包的拷贝,放到lib目录以便项目的引用. 2.拷贝框架的核心配置文件Struts.xml,放到src目录下,保留一个基本配置即 ...

  7. 第六届全球游戏大会( GMGC 北京 2017 )有哪些看点?

    全球游戏大会作为亚太地区极具影响力的全球性游戏行业盛会,本次第六届全球游戏大会( GMGC 北京 2017 )将力邀全球50个国家.500多位业界领袖.5000多家企业.50000多位业界精英参展参会 ...

  8. mysql数据库主从搭建

    一.最近一直在学习mysql的东西,刚好看到mysql如何搭建主从数据库,搜集了很多资料后大致了解了mysql主从复置的原理.以下是我的理解: 举例master为主数据库,slave为从数据库. sl ...

  9. netty中级篇(2)

    上一篇 netty入门篇(1) 一.编码解码技术 如何评价一个编解码技术: 是否支持跨语言,或者说支持的语言是否丰富 编码码流大小,影响传输速度 编码和解码的性能,即时间 类库是否精致,API是否方便 ...

  10. HDU 5873 Football Games

    随便判了几个条件就过了,也不知道对不对的. 正解应该是: $[1].$${s_1} + {s_2} + {s_3} + ...... + {s_n} = n(n - 1)$ $[2].$${s_1} ...