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

时间:2011-08-24 22:24:55

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

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

9 个答案:

答案 0 :(得分:48)

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

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

chrome://settings/cookies

在那里,您可以删除域的所有存储或仅删除某些本地存储实体。是的,URL仅表示'cookies',但此URL的界面包括所有类型的脱机存储。

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

答案 1 :(得分:46)

Spec说:

  

4.1数据库

     

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

答案 2 :(得分:13)

我正在开发一个带有离线存储的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目录中是否还有索引数据库数据库。

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

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

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

sqlite3 Databases.db
显然,一旦进入sqlite3 shell,就可以得到一些SQL知识。无论如何,它总是方便一些帮助,可通过命令

获得
.help

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

select * from Databases;

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

  

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

     

8 | file__0 | elfaro_dev | ElFaro para desarrollo | 734003200

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

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

delete from Databases where id = 8

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

rm file__0/8

就是这样。

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

答案 3 :(得分:7)

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

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

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

答案 4 :(得分:7)

开发者选项

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

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

新的Spec表示在功能中可能同时包含响应标头和javascript。 缺点是您无法控制被删除的内容,因此您需要先创建其他所有内容的备份,除非您要清除所有内容

  

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

但这对任何浏览器都不具备......

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

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

答案 5 :(得分:3)

这在HTML5 database storage (SQL lite) - few questions中得到解答。

总结:

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

答案 6 :(得分:3)

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

答案 7 :(得分:0)

请注意,如果您使用多个

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

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

答案 8 :(得分:-3)

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

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