Web SQL数据库API是一个独立的规范,在浏览器层面提供了本地对结构化数据的存储,已经被很多现代浏览器支持了。

我们通过一个简单的例子来了解下如何使用Web SQL API在浏览器端创建数据库表并存储数据。

<!doctype html>
<html><head><script>var end;function setupDB() {return this.createDatabase().then(createTable).then(insertEntry).then(readEntry).then(printResult);}function createTable() {return new Promise(function(resovle, reject) {console.log("prepare to create table..." + Date.now());this._db.transaction(function(query) {query.executeSql('create table if not exists user(id unique, user, passwd)');});setTimeout(_createTableOK.bind(this, resovle), 1000);});}function _createTableOK(resovle) {console.log("table created successfully..." + Date.now());resovle();}function createDatabase() {return new Promise(function(resovle, reject) {console.log("prepare to create database..." + Date.now());this._db = openDatabase('mydb', '1.0', 'JerryTestdb', 1024);setTimeout(_createDatabaseOK.bind(this, resovle), 1000);});}function _createDatabaseOK(resovle) {console.log("database created successfully..." + Date.now());resovle(this._db);}function insertEntry() {return new Promise(function(resolve, reject) {this._db.transaction(function(query) {query.executeSql("insert into user values (1,'Jerry','1234')");});setTimeout(_insertEntryOK.bind(this, resolve), 1000);});}function _insertEntryOK(resolve) {console.log("entry inserted to table successfully..." + Date.now());resolve();}function readEntry() {return new Promise(function(resolve, reject) {this._db.transaction(function(query) {query.executeSql('select * from user', [], function(u, results) {setTimeout(_readEntryOK.bind(this, resolve, results), 1000);}); // end of query.executeSql} // end of function(query)); // end of this._db.transaction});}function _readEntryOK(resolve, oResult) {console.log("entry readed from DB successfully..." + Date.now());resolve(oResult);}function printResult(oResults) {for (var i = 0; i < oResults.rows.length; i++) {document.writeln('id: ' + oResults.rows[i].id);document.writeln('user: ' + oResults.rows[i].user);document.writeln('passwd: ' + oResults.rows[i].passwd);}end = true;}function work() {if (end) {clearInterval(handle);} else {console.log(" working..." + Date.now());}}setupDB();var handle = setInterval(work, 200);</script>
</head></html>

在浏览器里执行这个应用,会创建一个名叫mydb的数据库,里面一张名为“user”的数据库表,并且插入一条记录进去,然后从数据库表中读取中来,打印在浏览器上。

下面就来分析下这90行代码。

程序的入口是setupDB这个函数,下面的setInterval起了1个间隔为200毫秒的周期执行函数,为了模拟当前浏览器除了进行Web SQL数据库外,还有其他的任务再执行。

setupDB

用promise实现了一个链式调用,第九行代码从语义上来说很容易理解:首先创建数据库(createDatabase),然后创建数据库表(createTable),然后插入一条记录到数据库表里(insertEntry), 然后马上把刚才插入表里的记录读出来(readEntry)。最后打印到浏览器上。

大家看我第16行的_createDatabaseOK的函数延时1秒执行,仅仅是为了演示WebSQL API 异步调用的最佳实践。

createDatabase函数的第15行,调用了Web SQL API的openDatabase,创建了一个名为mydb的数据库。openDatabase会返回一个数据库句柄,我们保存在属性_db里以便后续使用。

createTable

使用前一步骤得到的数据库句柄,通过数据库句柄暴露的API transaction, 执行一个数据库事务。事务的具体内容是一个SQL语句,通过executeSql调用来创建数据库表:

create table if not exists user(id unique, user, passwd)

用过JDBC的朋友对这种写法应该很熟悉。

数据库表明为user,主键为id,有两个列user和passwd。

insertEntry

在前一步骤中创建的user数据库表中插入一行记录,id为1,user值为Jerry,passwd为1234。

insert into user values (1,‘Jerry’,‘1234’)

readEntry

还是通过第一步创建的数据库句柄_db, 执行一个数据库事务,内容为SELECT语句,从user表里读出所有记录。

如果想清除掉Web SQL里的数据库表,在Chrome开发者工具里点击Clear storage:

选中您要清除的Storage类型,点“Clear Site Data"即可。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

通过90行代码学会HTML5 WebSQL的4种基本操作相关推荐

  1. 90行代码!大一学生自学编程,自创搜题网站,已在GitHub开源

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 大数据文摘出品 作者:Caleb 考试早已不是学生的"特权"了. ...

  2. OpenCV-Python实战(14)——人脸检测详解(仅需6行代码学会4种人脸检测方法)

    OpenCV-Python实战(14)--人脸检测详解(仅需6行代码学会4种人脸检测方法) 0. 前言 1. 人脸处理简介 2. 安装人脸处理相关库 2.1 安装 dlib 2.2 安装 face_r ...

  3. 90行代码轻松实现!结合 Whisper + Stable-diffusion 的语音生成图像任务!

    本项目将 Whisper 与 Stable Diffusion 模型结合,可以直接完成语音生成图像的任务.用户可以语音输入一个短句,Whisper 会自动将语音转化为文本,接着,Stable Diff ...

  4. HTML5游戏实战 2 90行代码实现捕鱼达人

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 捕鱼达人 ...

  5. HTML5游戏实战(2):90行代码实现捕鱼达人

    捕鱼达人是一款非常流行的游戏,几年里赚取了数以千万的收入,这里借用它来介绍一下用Gamebuilder+CanTK开发游戏的方法.其实赚钱的游戏未必技术就很难,今天我们就仅用90来行代码来实现这个游戏 ...

  6. onclick 源码_仿照React源码流程打造90行代码的Hooks

    作者:苏畅 转发链接:https://mp.weixin.qq.com/s/YLSD4IojDWTPlov_RQtVAA 前言 你可能已经看过其它简易的Hooks实现.那么本文和其它实现有什么区别呢? ...

  7. Python从入门到入土的90行代码

    文章目录 基础入门 菜鸟提升 基础晋级 高手之路 内置包库 奇技淫巧 基础入门 1 python 即在命令行输入python,进入Python的开发环境. 2 x = 1+2*3-4/5+6**2 加 ...

  8. c++ int8_t转int_Python 90行代码让微信地球转起来,你也可以!| 原力计划

    作者 | xiaorang 责编 | Aholiab 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 手机重启后打开微信的一瞬间,会看到一幅有名的图片,上面站着一个& ...

  9. Python 90行代码让微信地球转起来,你也可以!| 原力计划

    作者 | xiaorang 责编 | Aholiab 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 手机重启后打开微信的一瞬间,会看到一幅有名的图片,上面站着一个& ...

最新文章

  1. UVA1025 城市里的间谍 A Spy in the Metro(2003 ICPC world final)(DAG上DP)
  2. SAP PP COR3不能看工单后续的备料TO单号?
  3. Python高级教程-生成器
  4. 单例模式存在的问题——破坏单例模式,序列化和反射
  5. 编程之美-寻找最大的k个数
  6. PMcaff茶话会 · 杭州 | 玩转社交产品的那些事儿
  7. 获取数据库中的所有表
  8. 大数据WEB阶段 TransientDateAccessResourceException
  9. 【Linux】一步一步学Linux——pkill命令(126)
  10. mysql xtrabackup 主从_使用 Xtrabackup 在线对MySQL做主从复制
  11. 南京工业大学乐学python答案_铁乐学python_day09_作业
  12. [scikit-learn 机器学习] 7. 朴素贝叶斯
  13. 深圳手机厂家逐渐倾向谷歌Android手机
  14. python下载urllib3_使用urllib3下载网页
  15. face_recognition库的使用
  16. 如何清除PCB中负片层的死铜?
  17. linux 彻底删除oracle,Linux下完美卸载Oracle
  18. 【每日力扣10】有效的数独
  19. python写excel标记文字颜色_[知识积累]python3使用xlwt时写入文档字体颜色和边框样式--转载...
  20. coreldraw x4怎么会蓝屏_cdr点另存为没反应 步骤流程了解了么

热门文章

  1. sklearn自学指南(part46)--新颖性和离群值检测方法概述
  2. 文献阅读(part2)--Towards K-means-friendly spaces Simultaneous deep learning and clustering
  3. 第三次学JAVA再学不好就吃翔(part40)--import关键字
  4. h5是什么 www.php.cn,20分钟看懂html5 看看H5都有啥新特性
  5. python质数n以内_用Python寻找前n个质数
  6. 利用Python实现数据偏移
  7. npm run 脚本背后的事情
  8. SAP UI5 应用开发教程之六 - 了解 SAP UI5 的模块(Module)概念
  9. SAP Spartacus 服务器端渲染单步调试步骤之一:应用程序准备工作
  10. SAP Spartacus 3.0部署在development environment上