SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库

文章目录

  • 简介
  • 本地存储都有哪些?
  • 如何使用WebSQL
    • 打开数据库
    • 事务操作
    • SQL执行
  • 在浏览器端做一个英雄的查询页面
  • 如何删除本地存储
  • 参考文献

简介

WebSQL是一种操作本地数据库的网页API接口,通过它,我们可以操作客户端的本地存储。

WebSQL曾经是H5里很重要的一种技术,但是后来被废弃了,有的浏览器可能仍旧可以正常使用,但是已经不推荐了,而且大多数浏览器,如Chrome,已经直接禁用了WebSQL了,目前流行的替代品,应该是IndexedDB。

所以本节就是兴趣了解下就行。

主要包括以下内容:

  • 本地存储都有哪些?什么是WebSQL?
  • 使用WebSQL的三个核心方法是什么?
  • 使用WebSQL在本地浏览器里创建一个数据库,并对其进行查询和呈现。

本地存储都有哪些?

本地存储是一个很大的概念,其包括了Cookies、Local Storage、Session Storage、WebSQL、IndexedDB。

Cookies是最早的本地存储,是浏览器端提供,并且对服务器和JS开放,不过可以存储的数据总量只有4KB,如果超过了这个限制就会忽略,没法进行保存,所以一般用来记录一些登陆有关的信息之类的。

Local Storage与Session Storage都属于Web Storage。Web Storage跟Cookies类似,区别在于它有更大容量的存储。Local Storage是持久化的本地存储,除非我们主动删除数据,否则会一直保存在本地。Session Storage只存在于Session会话中,就是说只有在同一个Session页面才能使用。当Session会话结束时,数据也会自动释放。

Web SQL与IndexedDB都是最新的HTML5本地缓存技术,相比前面三种来说,其存储功能更强,支持的数据类型也更多,比如说图片、视频等。

Web SQL,准确的说是Web SQL DB API,它其实是一种操作客户端本地数据库的一类API接口,通过它我们可以很方便的实现基于SQL对本地数据库的增删改查。对浏览器来讲,所谓的本地数据库,一般是指SQLite,比如Chrome和Safari会用SQLite实现本地存储。

如果说WebSQL方便我们对RDBMS进行操作,那么IndexedDB就是一种NoSQL,它存储的是key-value型数据,通常可以超过250M,且支持事务。

在这里插入图片描述

可以看到,本地存储是包含了多种存储方式,它可以很方便的将数据存储在客户端中,从而避免重复调用服务器资源。

而WebSQL,其实并不属于是H5规范的一部分,是一个单独的规范,只是浏览器端同时接受了它跟H5规范。当年,主流的浏览器(Chrome、Safari和Firefox)基本都支持WebSQL,可以在js里通过WebSQL来对客户端数据库进行操作。

2023-11-9 14:15:17 不过我查了下,目前多数浏览器基本都关闭了WebSQL。

如何使用WebSQL

怎么检测你的浏览器是否支持WebSQL?

在你的浏览器里,F12打开命令行,执行以下代码:

if (!window.openDatabase) {alert('浏览器不支持WebSQL');
}

或者是打开以下html:

<!DOCTYPE HTML>
<html><head><meta charset="UTF-8"><title>SQL必知必会</title> <script type="text/javascript">                   if (!window.openDatabase) {alert('浏览器不支持WebSQL');}                               </script>                    </head><body><div id="status" name="status">WebSQL Test</div></body>       
</html>

如果浏览器不支持WebSQL,会弹窗提示"浏览器不支持WebSQL",否则不会有弹窗提示。试了一下,连chrome现在都禁用WebSQL了。

不过出于兴趣,接下来还是简单介绍下WebSQL的使用吧。

打开数据库

如果数据库存在,则会直接打开,返回一个数据库句柄,不存在则会创建。

var db = window.openDatabase(dbname, version, dbdesc, dbsize,function() {});

5个参数分别是数据库名、版本号、描述、数据库大小、创建回调。

比如说我们想要创建一个名为wucai的数据库,版本号为1.0,大小是1024*1024,单位应该是KB:

var db = openDatabase('wucai', '1.0', '王者荣耀数据库', 1024 * 1024);

事务操作

开启事务执行提交或者回滚操作,如下:

transaction(callback, errorCallback, successCallback); 

参数分别是:

  • 处理事务的回调函数。一般在里面写SQL语句,会用到ExecuteSQL方法;
  • 执行失败时的回调函数。可缺省;
  • 执行成功时的回调函数,可缺省。

比如说我们开启一个事务,来创建一个heros数据表,并插入一条数据:

db.transaction(function (tx) {tx.executeSql('CREATE TABLE IF NOT EXISTS heros (id unique, name, hp_max, mp_max, role_main)');tx.executeSql('INSERT INTO heros (id, name, hp_max, mp_max, role_main) VALUES (10000, "夏侯惇", 7350, 1746, "坦克")');
});

SQL执行

使用ExecuteSQL来执行SQL语句,即增删改查。

tx.executeSql(sql, [], callback, errorCallback);

有4个参数,分别是:

  • 要执行的SQL语句;
  • SQL语句中的占位符(?)所对应的参数;
  • 执行SQL成功时的回调函数;
  • 执行SQL失败时的回调函数。

因此,我们创建heros数据表的时候,使用如下命令:

tx.executeSql('CREATE TABLE IF NOT EXISTS heros (id unique, name, hp_max, mp_max, role_main)');

在浏览器端做一个英雄的查询页面

具体步骤如下:

  1. 初始化数据。在 HTML 中设置一个 id 为 datatable 的 table 表格,然后在 JavaScript 中创建 init() 函数,获取 id 为 datatable 的元素。
  2. 创建showData方法。用来展示我们查询出来的一行数据。
  3. 使用openDatabase打开数据库。
  4. 使用transaction执行两个事务。一个是创建heros数据表,并插入5条数据。另一个是对heros表进行查询,并将查询出的结果使用showData进行展示。

完整代码如下,我直接从教程里复制过来了:

<!DOCTYPE HTML>
<html><head><meta charset="UTF-8"><title>SQL必知必会</title> <script type="text/javascript">// 初始化function init() {datatable = document.getElementById("datatable");}// 显示每个英雄的数据function showData(row){var tr = document.createElement("tr");var td1 = document.createElement("td");var td2 = document.createElement("td");var td3 = document.createElement("td");var td4 = document.createElement("td");var td5 = document.createElement("td"); td1.innerHTML = row.id;td2.innerHTML = row.name;td3.innerHTML = row.hp_max;td4.innerHTML = row.mp_max;td5.innerHTML = row.role_main;tr.appendChild(td1);tr.appendChild(td2);tr.appendChild(td3);tr.appendChild(td4);tr.appendChild(td5);datatable.appendChild(tr);   }// 设置数据库信息var db = openDatabase('wucai', '1.0', '王者荣耀英雄数据', 1024 * 1024);var msg;// 插入数据db.transaction(function (tx) {tx.executeSql('CREATE TABLE IF NOT EXISTS heros (id unique, name, hp_max, mp_max, role_main)');tx.executeSql('INSERT INTO heros (id, name, hp_max, mp_max, role_main) VALUES (10000, "夏侯惇", 7350, 1746, "坦克")');tx.executeSql('INSERT INTO heros (id, name, hp_max, mp_max, role_main) VALUES (10001, "钟无艳", 7000, 1760, "战士")');tx.executeSql('INSERT INTO heros (id, name, hp_max, mp_max, role_main) VALUES (10002, "张飞", 8341, 100, "坦克")');tx.executeSql('INSERT INTO heros (id, name, hp_max, mp_max, role_main) VALUES (10003, "牛魔", 8476, 1926, "坦克")');tx.executeSql('INSERT INTO heros (id, name, hp_max, mp_max, role_main) VALUES (10004, "吕布", 7344, 0, "战士")');msg = '<p>heros数据表创建成功,一共插入5条数据。</p>';document.querySelector('#status').innerHTML =  msg;});// 查询数据db.transaction(function (tx) {tx.executeSql('SELECT * FROM heros', [], function (tx, data) {var len = data.rows.length;msg = "<p>查询记录条数: " + len + "</p>";document.querySelector('#status').innerHTML +=  msg;// 将查询的英雄数据放到 datatable中for (i = 0; i < len; i++){showData(data.rows.item(i));}});});</script></head> <body><div id="status" name="status">状态信息</div><table border="1" id="datatable"></table></body> 
</html>

演示结果如下:

在这里插入图片描述

如何删除本地存储

那如何删除本地存储呢?

直接通过浏览器来删除就可以了,比如在 Chrome 浏览器中找到 Application 中的 Clear storage,然后使用 Clear site data 即可。

在这里插入图片描述

参考文献

  1. 39丨WebSQL:如何在H5中存储一个本地数据库?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript之正方教务系统自动化教评[插件-转载]

【声明】本插件系学院学长原创&#xff0c;非博主所创&#xff0c;发布此处&#xff0c;仅供学习和效仿。 /*** name:正方教务系统自动化教评-插件* * author:chenzhongshu* date:2017-07-04* notice:原生js;无需依赖项**/(function() {var courseCode;var timer;var autoFill …

预计2024年之前载人登月!NASA授予马斯克贝索斯公司大单

来源&#xff1a;小小据外媒报道&#xff0c;当地时间周四&#xff0c;美国宇航局(NASA)宣布选中埃隆马斯克(Elon Musk)旗下美国太空探索技术公司SpaceX、杰夫贝索斯(Jeff Bezos)的蓝色起源公司&#xff08;Blue Origin&#xff09;和Dynetics为其设计和建造月球着陆系统&#…

java 遗传算法_[原]遗传算法Java实现源代码

【Title】[原]遗传算法Java实现源代码【Date】2013-04-07【Abstract】以前学习遗传算法时&#xff0c;用Java实现的遗传算法程序&#xff0c;现整理分享出来。【Keywords】wintys、遗传、算法、algorithm、种群、基因、个体、进化、染色体、适应度、Rosenbrock【Environment】W…

防止表单按钮多次提交

1. <form namefm method"POST" action"/"><p>按钮变灰</p>name: <input type"text" name"name"/><input type"button" value"提交" οnclick"javascript:{this.disabledtrue;doc…

理解进化的五座“桥”

来源&#xff1a;原理古往今来&#xff0c;达尔文是不是最具革命性的科学家之一&#xff1f;如果革命指的是把一个已经公认的学说颠倒过来&#xff0c;那挑战者还有很多&#xff0c;至少包括牛顿、爱因斯坦和量子力学的奠基者。这些物理学家超群绝伦的智慧能量&#xff0c;可能…

ACM训练计划建议(转)

ACM训练计划建议 From&#xff1a;freecode# Date&#xff1a;2015/5/20 前言&#xff1a; 老师要我们整理一份训练计划给下一届的学弟学妹们&#xff0c;整理出来了&#xff0c;费了不少笔墨&#xff0c;就也将它放到博客园上供大家参考。 菜鸟之作&#xff0c;大牛勿喷&…

java下载文件夹_java如何通过共享目录下载文件夹(有子文件夹)到本地目录?...

有没有大神会操作的&#xff1f;下面的代码只能下载文件夹下只是文件的&#xff0c;不能下载文件夹下包含子文件夹的文件public static void getShareFile(){System.out.println("开始");NtlmPasswordAuthentication auth new NtlmPasswordAuthentication("192…

【AI】【机器人】AI与机器人的42个终极问题与解答

来源&#xff1a;产业智能官 未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;云脑技术和企业图…

With you With me

With you With me 回来了&#xff0c;一起从零开始... 据说每一个敢说从零开始的都特么是个大牛&#xff08;for example hiphop-Man欧阳靖&#xff09;... 这些年的时间多有自己问自己&#xff0c;你特么到底在迷茫什么&#xff0c;想不通就去撞墙啊&#xff01;&#xff01;…

java集合转字符串,Java集合将字符串转换为字符列表

I would like to convert the string containing abc to a list of characters and a hashset of characters. How can I do that in Java ?List charList new ArrayList("abc".toCharArray());解决方案You will have to either use a loop, or create a collectio…

Linux服务器iops性能测试-fio

FIO是测试IOPS的非常好的工具&#xff0c;用来对硬件进行压力测试和验证&#xff0c;支持13种不同的I/O引擎&#xff0c;包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet,guasi, solarisaio 等等。 fio 官网地址&#xff1a;http://freecode.com/proj…

志澄观察:卫星互联网——太空经济新动力

图1 卫星互联网的组成来源&#xff1a;远望智库 引 言2020年04月20日国家发改委首次明确&#xff0c;将卫星互联网列入我国新型基础设施的范围&#xff0c;这项重大的战略决策&#xff0c;大大鼓舞了我国商业航天行业的信心。另一方面&#xff0c;2020年3月27日,在发展低…

java中位数_java 计算中位数方法

最近工作需要 要求把python的代码写成java版本&#xff0c;python中有一个np.median()求中位数的方法&#xff0c;java决定手写一个先说说什么是中位数&#xff1a;中位数就是中间的那个数&#xff0c;如果一个集合是奇数个&#xff0c;那么中位数就是按大小排列后&#xff0c;…

Unity 找到隐藏的UGUI

问题描述&#xff1a;在项目中需要在一开始将一个UGUI隐藏&#xff0c;之后在特定的时候再显示。 本来想的办法是在需要显示的时候调用GameObject.Find()找到这个UI并设置active&#xff0c; 但发现找出来的为null&#xff0c;经查阅资料发现GameObject.Find()只能find没有被隐…

一文读懂电磁学发展史[图文版]

来源&#xff1a;电子万花筒电磁学或称电动力学或经典电动力学。之所以称为经典&#xff0c;是因为它不包括现代的量子电动力学的内容。电动力学这样一个术语使用并不是非常严格&#xff0c;有时它也用来指电磁学中去除了静电学、静磁学后剩下的部分&#xff0c;是指电磁学与力…

java判断优先级代码_java运算符的优先级

下图是每种运算符的优先级&#xff0c;按照运算先后顺序排序(优先级相同的情况下&#xff0c;按照从左到右的顺序依次运算)优先级描述运算符1括号()、[]2正负号、-3自增自减&#xff0c;非、--、!4乘除&#xff0c;取余*、/、%5加减、-6移位运算<>、>>>7大小关系…

python语言学习笔记整理

什么是程序? 程序等于数据结构加算法&#xff0c;那么数据结构是一个静态的东西&#xff0c;算法是一个动态的东西&#xff0c;我们用一个新的语言编写这个程序&#xff0c;我们要考虑到语言也主要由数据结构和算法相关的东西&#xff0c;或静态或动态的东西来构成&#xff0c…

人机智能既不是人类智能,也不是人工智能

来源&#xff1a;人机与认知实验室从前&#xff0c;一个教授&#xff0c;去一个穷乡僻壤里头坐船过江&#xff0c;就问船上的船工&#xff1a;你学点数学没有&#xff1f;没有。你学点物理没有&#xff1f;没有。那懂不懂计算机啊&#xff1f;不懂。教授感叹这三样都不会&#…

使用HDFS客户端java api读取hadoop集群上的信息

本文介绍使用hdfs java api的配置方法。 1、先解决依赖&#xff0c;pom <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.7.2</version><scope>provided</scope>&l…

USACO 1.2 Milking Cows (枚举)

标记数组&#xff08;哈希&#xff09; 1e6的范围&#xff0c;开一个char数组全然能够&#xff0c;有人为1&#xff0c;无人为0&#xff0c;注意边界就可以。最后线性扫描就可以。时间复杂度&#xff0c;应该是O(n),n为最后结束的时间。缺点就是……比較慢 /*ID:twd30651PROG:m…