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

Der*_*會功夫 50 javascript sql google-chrome google-chrome-extension web-sql

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

我可以创建一个数据库,

var db = openDatabase('database', '1.0', 'my database', 2 * 1024 * 1024);
Run Code Online (Sandbox Code Playgroud)

我可以通过这样做来创建一个

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

我可以删除通过

db.transaction(function (tx) {
  tx.executeSql('DROP TABLE mytable');
});
Run Code Online (Sandbox Code Playgroud)

但有没有办法以database编程方式删除?

i_a*_*i_a 49

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

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

chrome://settings/cookies
Run Code Online (Sandbox Code Playgroud)

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

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

  • 似乎persistence.reset API不再可用,但您的删除方法很不错.似乎是在开发过程中实际删除数据库的唯一方法. (4认同)
  • 为了开发和测试,我使用“CTRL + SHIFT + I”进入 Chrome 上的检查屏幕,然后“应用程序”>“清除存储”。 (2认同)

ser*_*erg 46

规格说:

4.1数据库

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

  • wtf,那么如果让我说我会损坏数据库呢?这是不可接受的,我不能强迫用户清除所有cookie只是因为我的网站上的db损坏了 (4认同)
  • 为什么规范不支持删除数据库?如果他们没有桌子,他们为什么要永远在那里呢? (3认同)

his*_*_py 14

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

我正在研究某种"数据库清理器",以便在每个规范之后执行.当我在搜索如何删除web sql数据库时,我阅读了回复/sf/answers/765080781/(在这个帖子/问题中),然后去看看该目录中的内容(Mac OS X) .

cd ~/Library/Application\ Support/Google/Chrome/Default/databases
Run Code Online (Sandbox Code Playgroud)

在里面你会看到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
Run Code Online (Sandbox Code Playgroud)

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

.help
Run Code Online (Sandbox Code Playgroud)

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

select * from Databases;
Run Code Online (Sandbox Code Playgroud)

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

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

8 | file__0 | elfaro_dev | ElFaro para desarrollo数据库| 734003200

第一列是表的id,它是用于db文件名的数字,第二列是origin(目录),其他列是db名称,db描述和从中创建db时使用的估计大小Javascript API.

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

delete from Databases where id = 8
Run Code Online (Sandbox Code Playgroud)

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

rm file__0/8
Run Code Online (Sandbox Code Playgroud)

就是这样.

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


End*_*ess 8

开发者选项

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

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

规格说,这可能会在可能的功能既响应头和JavaScript.的缺点是你无法控制被删除,所以,你会需要首先一切的创建备份,除非你想清楚一切

2.1.3.存储参数

存储参数指示服务器希望移除与特定响应的URL的原点相关联的本地存储的数据.这包括存储mechansims如(本地存储,sessionStorage的,[索引资料],[WEBDATABASE],等等),以及切向相关mechainsm如服务工人注册.

JS:

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

响应头:

res.header("Clear-Site-Data", "storage; includeSubdomains");
Run Code Online (Sandbox Code Playgroud)

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

用法

dropDatabase("database", function(){
    console.log("done")
});
Run Code Online (Sandbox Code Playgroud)


Wyt*_*tze 7

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

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

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