如何以编程方式删除WebSQL中的数据库?

我是新的Web SQL数据库 ,我用它来保存数据在本地数据库中的网页。

我可以通过创build一个数据库

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

我可以通过这个来创build一个表格

 db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS mytable (blah,blah)'); }); 

我可以通过删除 表格

 db.transaction(function (tx) { tx.executeSql('DROP TABLE mytable'); }); 

但有没有办法通过编程方式删除database

规格说:

4.1数据库

每个来源都有一组关联的数据库。 每个数据库都有一个名称和一个当前版本。 无法枚举或删除可用于此API的原始数据库

使用PersistenceJS有一个persistence.reset API将清理数据库。 PersistenceJS站点

为了开发/testing的目的,您可以查看内容并删除webSQL,IndexedDB,cookies等search您的域名在这个URL在Chrome浏览器:

 chrome://settings/cookies 

在那里,你可以删除一个域的所有存储或只是某些本地存储实体。 是的,该url只包含“cookies”,但该url的界面包含所有types的离线存储。

如果Chrome开发人员工具界面能够在“资源”选项卡中右键单击并删除数据存储实体并检查内容,那么这将非常棒。 但现在,我所知道的是settings / cookie的URL。

我正在开发一个phonegap + jquery-mobile + KO应用程序,使用web sql通过persistencejs离线存储,jasmine js用于BDD。

我正在研究某种“数据库清理”,在每个规范之后执行。 当我search如何删除一个Web数据库时,我阅读了回复https://stackoverflow.com/a/10929725/667598 (在这个线程/问题),并去看看那个目录(Mac OS X) 。

 cd ~/Library/Application\ Support/Google/Chrome/Default/databases 

在里面你会看到一个Databases.db的SQLite3数据库,以及每个来源的目录。 这些目录用模式protocol_host_somenumber命名(我不知道这个数字是什么)。 例如,就我而言,因为我的应用程序只是我在Google Chrome中使用file:/// …协议打开的文件,所以我可以看到一个file__0目录。 而对于Twitter,我也可以看到一个http_twitter.com_0和一个https_twitter.com_0。

在这个目录里,所有的文件名都是数字。 例如,在file__0里面,我find了一个名为8的文件,另一个名为9.在我的情况下,这些文件是websql数据库。 我不知道在chrome的Default/databases目录中是否还有索引DB数据库。

有了这个名字,有点难以猜测什么是数据库。 你可以打开数据库,你必须通过它的表和数据推断应用程序或网站。

幸运的是,我之前提到的Databases.db是用数字命名的文件和数据库之间的映射。

您可以使用sqlite3命令打开Databases.db和任何其他web sql文件

 sqlite3 Databases.db 

很明显,一旦进入sqlite3 shell,便于掌握一些SQL知识。 无论如何,这也总是方便一些帮助,这是可以通过命令

 .help 

使用.tables命令,您可以在数据库中列出表格。 在这个Databases.db里面,我们可以find表数据库和元。 重要的是数据库,所以有一个

 select * from Databases; 

我们可以看到数据库和他们的文件之间的映射。 例如

7 | http_jquerymobile.com_0 | testdb | html5 test db | 200000

8 | file__0 | elfaro_dev | ElFaro para desarrollo的基础| 734003200

第一列是用于数据库文件名的表的ID,第二列是起源(目录),其他列是数据库名称,数据库描述以及从数据库创build数据库时使用的估计大小Javascript API。

所以要实际删除一个数据库,我所做的就是从这个表中删除它,例如:

 delete from Databases where id = 8 

然后删除文件系统中的实际文件(外部sqlite3shell)

 rm file__0/8 

就是这样。

PS: 我知道这对于一个简单的主题来说是一个太长的回答,但我只需要从我的系统中清除这个问题,并将其备份到SO或博客等某个地方。

本地数据库文件存储在Windows应用程序数据> Google> Chrome>用户数据>默认>数据库的Windows用户设置中。

所以手动删除它们在理论上是可能的。 这只在您自己的计算机上进行testing/开发时才有用,因为当另一个用户打开您的应用程序/站点时,不太可能拥有文件系统访问权限。

但是,即使您可以find这些文件并将其删除,数据仍然存在。 我已经使用Chrome打开和closures,并且所有的chrome进程结束了,但浏览器检查器不断向我显示我的旧数据库,其中包含所有不需要的字段和数据。

开发人员选项

无法以编程方式枚举或删除数据库(还)。
Chrome开发者可以导航到chrome://settings/cookiessearch并删除任何数据库Opera开发者可以导航到opera://settings/cookies

真正删除数据库的唯一方法(和其他所有内容)

一个新的规格说这可能是在这个function与响应头和JavaScript。 缺点是你不能控制什么被删除,所以你需要首先创build一个备份,除非你想清除所有的东西

2.1.3。 存储参数

存储参数指示服务器希望移除与特定响应的URL的来源相关联的本地存储的数据。 这包括存储机制,如( localStorage,sessionStorage,[INDEXEDDB],[WEBDATABASE]等 ),以及切线相关的机制,如服务工作者注册。

JS:

 navigator.storage.clear({ types: [ "storage" ], includeSubdomains: true // false by default }); 

响应标题:

 res.header("Clear-Site-Data", "storage; includeSubdomains"); 

但是这对于任何浏览器都是不可行的

最好的解决scheme为客户(而不是开发者)

 /* This will fetch all tables from sqlite_master * except some few we can't delete. * It will then drop (delete) all tables. * as a final touch, it is going to change the database * version to "", which is the same thing you would get if * you would check if it the database were just created * * @param name [string] - the database to delete * @param cb [function] - the callback when it's done */ function dropDatabase(name, cb){ // empty string means: I do not care what version, desc, size the db is var db = openDatabase(name, "", "", ""); function error(tx, err){ console.log(err); } db.transaction(ts => { // query all tabels from sqlite_master that we have created and can modify var query = "SELECT * FROM sqlite_master WHERE name NOT LIKE 'sqlite\\_%' escape '\\' AND name NOT LIKE '\\_%' escape '\\'"; var args = []; var success = (tx, result) => { var rows, i, n, name; rows = result.rows; n = i = rows.length; // invokes cb once it's called n times function after(){ if (--n < 0) { // Change the database version back to empty string // (same as when we compear new database creations) db.changeVersion(db.version, "", function(){}, error, cb); } } while(i--){ // drop all tabels and calls after() each time name = JSON.stringify(rows.item(i).name); tx.executeSql('DROP TABLE ' + name, [], after, error); } // call it just 1 more extra time incase we didn't get any tabels after(); }; ts.executeSql(query, args, success, error); }); } 

用法

 dropDatabase("database", function(){ console.log("done") }); 

这在HTML5数据库存储(SQL lite)中得到了回答- 几个问题 。

总结:

  • 目前没有办法丢弃WebSQL数据库。
  • 可能使用索引DB或localStorage。

在我的库实现中,我只是删除所有表。 其中,确实删除了数据库。 select * from sqlite_master

请注意,如果你使用多个

 tx.executeSql('DROP TABLE mytable'); 

在同一事务callback中的语句,然后确保它们全都存在,或者考虑使用DROP TABLE IF EXISTS语法。 如果即使一个表不存在,当您尝试删除它将导致整个事务失败。 这种失败会导致事务回滚,并意味着即使您认为数据已经被删除,数据也会保留在数据库中。 没有错误报告,除非你在executeSql的第四个参数中是一个错误的callback。 这是有意的行为,但以我的经验来说,这是令人困惑的。

没有方法来删除websql中的现有数据库,它将清除caching清除或
浏览器已closures。 如果你想创build一个名字相同的数据库只要使用openDatabase方法首先会检查数据库是否存在同名的数据库。 如果不存在,它将创build一个,否则它将打开现有的

请按照此链接http://html5doctor.com/introducing-web-sql-databases/