【问题标题】:How to delete a database in WebSQL programmatically?如何以编程方式删除 WebSQL 中的数据库?
【发布时间】:2011-11-03 05:25:58
【问题描述】:

我是 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

【问题讨论】:

  • 要删除数据库本身,请将其从~/Library/Application\ Support/Google/Chrome/Default/databases中删除。

标签: javascript sql google-chrome google-chrome-extension web-sql


【解决方案1】:

开发者选项

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

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

一个新的Spec 说这可能在功能 中具有响应标头和javascript。 缺点是您无法控制要删除的内容,因此您需要先创建备份,除非您想清除所有内容

2.1.3。存储参数

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

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

【讨论】:

  • navigator.storage.clear(...) 似乎没有从 Chrome 78 开始实现:/
【解决方案2】:

使用 PersistenceJS 有一个 persistence.reset API 可以清除数据库。 PersistenceJS Site

出于开发/测试目的,您可以通过在 Chrome 中的此 URL 搜索您的域名来查看内容并删除 webSQL、IndexedDB、cookie 等:

chrome://settings/cookies

在那里,您可以删除域的所有存储或仅删除某些本地存储实体。是的,该 URL 仅暗示“cookies”,但此 URL 的接口包括所有类型的离线存储。

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

【讨论】:

  • 超级!我知道 Persistence(使用它),但对于开发,cookie 设置是一座金矿!
  • 似乎persistence.reset API不再可用,但您的删除方法很好。似乎是在开发过程中实际删除数据库的唯一方法。
  • 为了开发和测试,我使用CTRL + SHIFT + I进入Chrome上的检查屏幕,然后Application > Clear storage
【解决方案3】:

请注意,如果您使用多个

tx.executeSql('DROP TABLE mytable'); 

同一事务回调中的语句然后确保它们都存在或考虑改用 DROP TABLE IF EXISTS 语法。如果在您尝试删除时甚至一个表都不存在,它将导致整个事务失败。此失败会导致事务回滚,这意味着即使您认为应该删除数据,数据仍将保留在您的数据库中。除非您在 executeSql 的第 4 个参数中专门监听它,否则不会报告错误,这是一个错误回调。这是预期的行为,但根据我的经验,这是令人困惑的。

【讨论】:

    【解决方案4】:

    我正在开发一个 phonegap+jquery-mobile+KO 应用程序,它使用 web sql 通过 persistencejs 和 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 数据库,以及每个来源的目录。这些目录以模式 protocol_host_somenumber 命名(我不知道那个数字是什么)。例如,就我而言,由于我的应用程序只是我在 Google Chrome 中使用 file:/// ... 协议打开的文件,因此我可以看到一个 file__0 目录。对于 twitter,我还可以看到 http_twitter.com_0 和 https_twitter.com_0。

    在此目录中,所有文件名都只是数字。例如在 file__0 中,我找到了一个名为 8 的文件和另一个名为 9 的文件。在我的例子中,这些文件是 websql 数据库。我不知道 chrome 的 Default/databases 目录中是否还有 Indexed DB 数据库。

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

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

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

    sqlite3 Databases.db
    

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

    .help
    

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

    select * from Databases;
    

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

    7|http_jquerymobile.com_0|testdb|html5 测试数据库|200000

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

    第一列是表的 id,它是用于 db 文件名的编号,第二列是源(目录),其他列是 db 名称、db 描述和创建时使用的估计大小来自 Javascript API 的数据库。

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

    delete from Databases where id = 8
    

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

    rm file__0/8
    

    就是这样。

    PS:我知道这对于一个简单的主题来说太长了,但我只需要从我的系统中刷新它并将其备份到 SO 或博客之类的地方。

    【讨论】:

      【解决方案5】:

      my library 实现中,我只是删除了所有表。确实,其中删除了数据库。表列表为select * from sqlite_master

      【讨论】:

      • Websql,即sqlite。
      【解决方案6】:

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

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

      【讨论】:

      • 您从哪里得知关闭浏览器时 websql 会清除?
      【解决方案7】:

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

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

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

      【讨论】:

      • 在win7上,我找到了您上面提到的文件夹,其中包含每个域的子文件夹。幸运的是,我想删除的文件中只有一个文件,并且数据库没有重新启动 chrome 或类似的东西就消失了。
      • 这对我来说是唯一可行的答案。我尝试使用 chrome://settings/cookies 删除所有内容,但这不起作用(版本 38.0.2)。仅供参考,您可以使用 notepad++ 之类的文本编辑器打开数据库文件(我的 webDb 文件的名称只是一个数字),它会显示您的数据。这样您就可以确保删除了正确的数据库。
      【解决方案8】:

      HTML5 database storage (SQL lite) - few questions 回答了这个问题。

      总结一下:

      • 目前无法删除 WebSQL 数据库。
      • 可能改用 Indexed DB 或 localStorage。

      【讨论】:

        【解决方案9】:

        Spec 说:

        4.1 数据库

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

        【讨论】:

        • 为什么规范不支持删除数据库?如果里面没有桌子,为什么要永远存在?
        • wtf,如果说我会损坏数据库怎么办?这是不可接受的,我不能仅仅因为我网站上的 db 损坏就强制用户清除所有 cookie
        猜你喜欢
        • 1970-01-01
        • 2011-05-23
        • 2017-01-11
        • 1970-01-01
        • 2017-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多