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

How to delete a database in WebSQL programmatically?

本文关键字:编程 方式 删除 数据库 WebSQL      更新时间:2023-09-26

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

我可以创建数据库,

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

, 创建这样

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

我可以删除,

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

,但是否有一种方法来删除 database 编程?

使用PersistenceJS有一个持久性。reset API将擦除数据库干净。PersistenceJS网站

对于开发/测试的目的,您可以查看内容和删除webSQL, IndexedDB, cookie等通过搜索您的域名在这个URL在Chrome:

chrome://settings/cookies

在这里,您可以删除一个域的所有存储或仅删除某些本地存储实体。是的,这个URL只暗示了"cookies",但是这个URL的接口包含了所有类型的离线存储。

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

说明:

4.1数据库

每个origin都有一组相关联的数据库。每个数据库都有一个名称和当前版本。没有办法从这个API中枚举或删除数据库

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

我正在做某种"数据库清理器"。当我在搜索如何删除web sql数据库时,我阅读了回复https://stackoverflow.com/a/10929725/667598(在这个线程/问题中),然后去看看那个目录(Mac OS X)中有什么。

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

里面你会看到一个Databases.db SQLite3数据库,以及每个origin的目录。这些目录以模式protocol_hostrongomenumber(我不知道这个数字是什么)命名。因此,例如,在我的情况下,因为我的应用程序只是我在谷歌浏览器中打开的文件与file:///…协议,我可以看到一个file_0目录。对于twitter我还可以看到一个http_twitter.com_0和一个https_twitter.com_0

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

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

幸运的是,我前面提到的databases. db是那些以数字命名的文件和数据库之间的映射。

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

sqlite3 Databases.db

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

获得
.help

使用.tables命令可以列出数据库中的表。在这个database .db中,我们可以找到Databases和meta表。重要的是数据库,所以用

select * from Databases;

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

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

8| file_0 |elfaro_dev|Base de datos de ElFaro para desarrollo|734003200

第一列是表的id,这是用于db文件名的编号,第二列是起源(目录),其他列是db名称,db描述和从Javascript API创建db时使用的估计大小。

要真正删除一个数据库,我所做的是从这个表中删除它,例如:

delete from Databases where id = 8

然后从文件系统中删除实际文件(在sqlite3 shell之外)

rm file__0/8

就是这样。

PS: 我知道这对于一个简单的主题来说是一个太长的答案,但我只是需要从我的系统中冲洗它并备份到某个地方,如SO或博客

开发者选项

无法以编程方式枚举或删除数据库(目前)。
Chrome开发者可以导航到chrome://settings/cookies搜索和删除任何数据库Opera开发人员可以导航到opera://settings/cookies

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

一个新的规范说,这可能是在特性与响应头和javascript。的缺点是不能控制要删除的内容,所以除非您想清除

的所有内容,否则您需要首先为其他所有内容创建备份。

2.1.3。存储参数

storage参数表示服务器希望删除本地存储的与特定响应url源相关联的数据。这包括存储机制,如(localStorage, sessionStorage, [INDEXEDDB], [WEBDATABASE]等),以及相关的机制,如service worker注册。

Js:

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

响应头:

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

但这还不能在任何浏览器中使用…

为客户(而不是开发人员)提供的最佳解决方案

/* 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")
});

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

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

然而,即使您可以找到文件并删除它们,数据仍然存在。我已经尝试过Chrome打开和关闭,所有的Chrome进程结束,但浏览器检查器一直显示我的旧数据库与所有不需要的字段和数据在它。

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

总结:

  • 当前无法删除WebSQL数据库。
  • 可能使用索引DB或localStorage代替。

在我的库实现中,我只是删除了所有表。也就是说,删除数据库。表格列表为select * from sqlite_master

请注意如果您使用多个

tx.executeSql('DROP TABLE mytable'); 
在同一个事务回调中的

语句,然后确保它们都存在,或者考虑使用DROP TABLE IF EXISTS语法代替。当您试图删除时,即使只有一个表不存在,也会导致整个事务失败。此失败将导致事务回滚,并意味着数据将保留在数据库中,即使您认为应该删除它。没有错误报告,除非你特别在executeSql的第4个参数中监听它,这是一个错误回调。这是有意为之的行为,但根据我的经验,这是令人困惑的。

没有办法在websql中删除现有的数据库,当缓存被清空时它将被清除或
浏览器关闭。如果你想创建一个同名的数据库,只需使用openDatabase方法,它将首先检查是否存在同名的数据库。如果不存在,则创建一个,否则将打开现有的

请点击此链接http://html5doctor.com/introducing-web-sql-databases/