基于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。但是并不影响其当前功能的使用,依然很强悍,使用者不在少数。
基于HTML5 的WebSql本地设备数据库的更多相关文章
- 基于HTML5的Web跨设备超声波通信方案
前言:Chirp在iPhone上掀起了有声传输文件的序幕,我们再也不需要彩信.蓝牙配对.IM来传送数据.它通过“叽叽喳喳”的小鸟叫声来分享数据,简单有趣,而且可以快速的实现一对多的分享. 此外支付宝曾 ...
- HTML5本地存储和本地的数据库
一个网站如何能在客户的浏览器存储更多的数据呢? 在Html4的时代在浏览器端存储点网站个性化的数据,尤其是用户浏览器的痕迹,用户的相关数据等一般只能存储在Cookie中,但是大多是浏览器对于Cooki ...
- 基于Html5的移动端开发框架的研究
下面统计信息部分来自网络,不代表个人观点.请大家参考. 基于Html5移动端开发框架调查 序号 框架 简介 优点 缺 ...
- 基于 HTML5 的数据存储
以前想做个静态网页APP.最初的思路是用本地文件存储数据,后来发现在手机上运行时,文件无法找到. 经过了长达几个月的搜索(实际也就几天),没有找到合适的方法. 就在绝望的时候,无意间搜到基于HTML5 ...
- 基于Html5的移动端APP开发框架
快速增长的APP应用软件市场,以及智能手机的普及,手机应用:Native(原生)APP快速占领了APP市场,成为了APP开发的主流,但其平台的不通用性,开发成本高,多版本开发等问题,一直困扰着专业AP ...
- 基于HTML5的Web SCADA工控移动应用
在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在 ...
- 基于HTML5移动web应用
一.基于HTML5移动web应用 1.canvas 绘图 2.多媒体 3.本地存储 4.离线应用 5.使用地理位置 6.移动web框架 二.具体说明 1.HTML5标准最大的变化就是支持Web绘图 ...
- 快速开发基于 HTML5 网络拓扑图应用
采用 HT 开发网络拓扑图非常容易,例如<入门手册>的第一个小例子麻雀虽小五脏俱全:http://www.hightopo.com/guide/guide/core/beginners/e ...
- 基于HTML5技术的电力3D监控应用(二)
上篇介绍了我们电力项目的基本情况,我们选用HTML5技术还是顶着很大压力,毕竟HTML5技术性能行不行,浏览器兼容性会不会有问题,这些在项目选型阶段还是充满疑惑,项目做到现在终于快收尾了我们才敢松口气 ...
随机推荐
- sql数据黑马程序员——SQL入门
最近研究sql数据,稍微总结一下,以后继续补充: ---------------------- ASP.Net+Android+IO开辟S..Net培训.等待与您交流! --------------- ...
- Android Apk获取包名和Activity名称
一.使用aapt(Android Asset Packaging Tool)工具获取: 1.配置Android环境: a.添加build-tools/android路径到系统环境变量的中Path中,注 ...
- 写一些脚本的心得总结系列第4篇-------从数据库同步到redis
5.从数据库同步到redis的. redis把数据放内存里,读取都非常方便,也提供了远超memcache的丰富数据结构.下面我举2个例子,比如1)把数据从数据库写入到redis: <?php $ ...
- 【转】简单十步让你全面理解SQL
简单十步让你全面理解SQL 很多程序员认为SQL是一头难以驯服的野兽.它是为数不多的声明性语言之一,也因为这样,其展示了完全不同于其他的表现形式.命令式语言. 面向对象语言甚至函数式编程语言(虽然有些 ...
- 【C语言】字符串模块
一.字符串简介 * 在Java中,一个字符串可以用String类型来存储 String s = "MJ"; C语言中没有String这种类型.其实字符串就是字符序列,由多个字符组成 ...
- zookeeper删除kafka元数据
问题:卸载kafka前未删除kafka topic,重新安装kafka后,生成跟之前topic名字相同的topic时报错,显示topic已存在 [root@d96 ~]# kafka-topics - ...
- [HMLY]14.对iOS开发中使用MVVM的理解和使用(初级)
前言 MVVMDemo 之前几个月一直在学习react-native,它的组件化开发真的是很棒,控件和页面的组件化在开发中可以很好的复用,节省开发时间.在那个时候还不知道react-native开发用 ...
- C# WinForm 类似QQ靠近屏幕边缘隐藏显示
当窗体离屏幕四周一定距离时,改变窗体位置,引导窗体靠边:靠边后,当鼠标离开窗体时,改变窗体位置,窗体隐藏,凸出一点在屏幕内:隐藏后,当鼠标移到窗体时,窗体显示. using System; using ...
- [转]RadStudio DELPHI/C++ BUILDER Berlin 10.1 Update2安装破解教程
源链接:http://bbs.fishc.com/thread-76730-1-1.html 免责声明:本教程所有资源均为学习交流之用,软件和资料版权归原开发公司所有,请于下载后24小时内删除,禁止用 ...
- iOS根据网络图片的size大小设置UIImageView的大小
有时候在设置UIImageView的大小时候需要根据UIimage的长宽比来自动设置,不让图片原比例失真. 如果是从本地获取到的图片,[UIImage imageNamed:@"" ...