53

我是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编程方式删除?

4

9 回答 9

51

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

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

chrome://settings/cookies

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

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

于 2013-03-25T13:39:09.390 回答
46

规格说:

4.1 数据库

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

于 2011-08-24T22:34:09.047 回答
14

我正在开发一个 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 数据库。Default/databases我不知道 chrome 的目录中是否还有 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 描述和从创建 db 时使用的估计大小Javascript API。

因此,要实际删除数据库,我所做的是从该表中删除它,例如:

delete from Databases where id = 8

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

rm file__0/8

就是这样。

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

于 2014-01-17T19:55:58.710 回答
9

开发者选项

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

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

一个新的规范说这可能在响应头和 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")
});
于 2015-10-03T21:11:31.523 回答
7

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

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

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

于 2012-06-07T10:09:57.973 回答
3

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

总结一下:

  • 目前没有办法删除 WebSQL 数据库。
  • 可能改用 Indexed DB 或 localStorage。
于 2011-08-24T22:34:56.037 回答
3

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

于 2013-08-25T12:58:14.153 回答
0

请注意,如果您使用多个

tx.executeSql('DROP TABLE mytable'); 

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

于 2015-06-25T20:20:26.400 回答
-3

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

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

于 2013-08-22T10:08:45.073 回答