基于HTML5 的WebSql本地设备数据库

  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。但是并不影响其当前功能的使用,依然很强悍,使用者不在少数。

时间: 2024-12-27 08:08:47

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

HTML5 indexedDB前端本地存储数据库实例教程 (转载)

一.indexedDB为何替代了Web SQL Database? 跟小朋友的教育从来没有什么“赢在起跑线”这种说法一样,在前端领域,也不是哪来先出来哪个就在日后引领风骚的. HTML5 indexedDB和Web SQL Database都是本地数据库数据存储,Web SQL Database数据库要出来的更早,然并卵.从2010年11月18日W3C宣布舍弃Web SQL database草案开始,就已经注定Web SQL Database数据库是明日黄花. 未来一定是indexedDB的,从

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

前言:Chirp在iPhone上掀起了有声传输文件的序幕,我们再也不需要彩信.蓝牙配对.IM来传送数据.它通过“叽叽喳喳”的小鸟叫声来分享数据,简单有趣,而且可以快速的实现一对多的分享. 此外支付宝曾经试推过“声波支付”,利用手机发送超声波至终端作为交易密码进一步完成交易.然而支付宝的技术目前只是使用在了支付上,而需要可接受声波支付的特定售货机方可使用. <Advanced Sound for Games and Interactive Apps - WebAudio API>的作者Boris

基于HTML5的网络拓扑图 - 设备状态面板

电信网管系统中,设备状态信息的实时展示非常重要,通常会挂载一堆图标来展示状态或告警信息,图标的信息量有限,有时需要更详细的面板,甚至以图表的形式展现,本文将结合最近客户提到的需求,使用 Qunee1.6 beta版本,实现拓扑图中设备信息的实时显示. Qunee 中ui 的定制非常灵活,每个图元节点都可以挂载多个 ui 控件,支持9X9=81种相对位置,单节点上能挂载多个 ui 元素,并进行排列和布局,另外每个 ui 元素可以绑定图元属性,属性变化,ui 元素会及时更新界面. 需求分析 网络设备

wwwlyjustcom基于HTML5快速搭建3D机房设备面板199O8836661

以真实设备为模型,搭建出设备面板,并实时获取设备运行参数,显示在设备面板上,这相比于纯数值的设备监控系统显得更加生动直观.今天我们就在HT for Web的3D技术上完成设备面板的搭建. 我们今天模拟的设备是机房设备,先来目睹下最终效果: 基于HTML5快速搭建3D机房设备面板我来解释下这个模型,一个带有透明玻璃门的机柜,机柜里装有5台设备,门可以开合,设备可以插拔,那么我么该如何搭建这样的设备呢?方法不难,我们一步一步来.基于HTML5快速搭建3D机房设备面板看起来有模有样的,其实呢,它就是一

基于 HTML5 的数据存储

以前想做个静态网页APP.最初的思路是用本地文件存储数据,后来发现在手机上运行时,文件无法找到. 经过了长达几个月的搜索(实际也就几天),没有找到合适的方法. 就在绝望的时候,无意间搜到基于HTML5的各种保存数据的方法.在此简单与大家分享一下. 前四种是从http://www.hightopo.com/blog/344.html截取. Cookie 最古老的存储方式为Cookie,这种存储方式存储内容很有限,只适合做简单信息存储,存取接口设计得极其反人类,为了介绍HTML5存储方案的完整性我顺

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

下面统计信息部分来自网络,不代表个人观点.请大家参考.         基于Html5移动端开发框架调查                                   序号 框架 简介 优点 缺点 备注 侧重点         1 PhoneGap   PhoneGap是一个用基于HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的快速开发平台.它使开发者能够利用iPhone,Android,Palm,Symbian,WP7,WP8,Bada和Blackberry智能手机

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

在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在HTML5流行前VML和SVG算是真正纯种Web方案也是有不少应用,近些年随着HTML5的流行,加上移动终端对HTML5支持的普及,越来越多新项目开始采用真正纯HTML5的方案,更具体的说大数据量应用性能高于SVG的Canvas方案,已经逐渐成为当今Web SCADA前端技术的首选标配方案. htt

使用PhoneGap开发基于Html5应用一:PhoneGap简介

兄弟们,我胡汉三又回来啦! 1.何为PhoneGap 之前我的一个客户有这么一个要求:开发一款移动应用,但不需要做成本地应用,而是做成一个类似网页一样的应用.这样我们只需要在浏览器里访问他们公司的这个应用的网页就可以实现本地化应用的基本功能.但有个问题是,出于安全考虑,android,iOS都没有提供通过浏览器调用手机设备中的摄像头,GPS定位等设备的接口(iOS提供了部分).为了实现这个功能,PhoneGap是个超级可爱的东东就产生了. 如果亲爱的你曾经做过iOS或者Android开发的话应该

移动开发中HTML5能否替代本地程序

随着移动设备越来越先进,对HTML5的支持度越来越高,我们进军移动领域的时候,都会遇到一个问题,是选择HTML5和还是Native(用原生代码编写的本地程序)?HTML5的前景无疑是诱人的,一句"Write once, run anywhere"就可以秒杀一切.笔者最近两年来对HTML5与Native有较为深入的研究,觉得两者之间不能仅仅是二分法来选择,还要根据企业自身的情况.团队的构成.公司的战略以及产品的特点来综合选择. HTML5的发展前景我无疑是非常看好的,各大公司也不遗余力的