Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何以编程方式删除WebSQL中的数据库?_Javascript_Sql_Google Chrome_Google Chrome Extension_Web Sql - Fatal编程技术网

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

Javascript 如何以编程方式删除WebSQL中的数据库?,javascript,sql,google-chrome,google-chrome-extension,web-sql,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('DROP TABLE mytable'); });  通过这样做,我可以创建一个表 db.transaction(function (tx) { tx.execu

我不熟悉Web SQL数据库,我使用它将数据保存在网页中的本地数据库中

 我可以通过

var db = openDatabase('database', '1.0', 'my database', 2 * 1024 * 1024);
db.transaction(function (tx) {
  tx.executeSql('DROP TABLE mytable');
});
 通过这样做,我可以创建一个

db.transaction(function (tx) {
  tx.executeSql('CREATE TABLE IF NOT EXISTS mytable (blah,blah)');
});
 我可以通过删除

var db = openDatabase('database', '1.0', 'my database', 2 * 1024 * 1024);
db.transaction(function (tx) {
  tx.executeSql('DROP TABLE mytable');
});
 但是有没有一种方法可以通过编程方式删除
数据库呢?

说:

4.1数据库

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

这一点已得到答复

总结如下:

  • 目前无法删除WebSQL数据库
  • 可能改用索引数据库或本地存储

本地数据库文件存储在Windows用户设置中的“应用程序数据>谷歌>浏览器>用户数据>默认值>数据库”下

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


但是,即使您可以找到文件并将其删除,数据仍然会保留。我用Chrome打开和关闭都试过了,所有Chrome进程都结束了,但浏览器检查器一直向我显示我的旧数据库,其中包含所有不需要的字段和数据。

使用PersistenceJS有一个persistence.reset API,它将清除数据库。

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

chrome://settings/cookies
在那里,您可以删除一个域的所有存储,或仅删除某些本地存储实体。是的,URL仅表示“cookies”,但此URL处的接口包括所有类型的脱机存储


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

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


请按照此链接执行,我只是删除了所有表。实际上,删除数据库。表列表是
select*from sqlite_master

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

我正在研究某种“数据库清理器”,在每个规范之后执行。当我搜索如何删除web sql数据库时,我阅读了回复(在这个线程/问题中),并查看了该目录中的内容(Mac OS X)

在内部,您将看到Databases.dbsqlite3数据库以及每个源的目录。这些目录是用模式协议\u host\u somenumber命名的(我不知道那个数字是什么)。例如,在我的例子中,由于我的应用程序只是我用file://…协议在Google Chrome中打开的文件,所以我可以看到一个file\u0目录。对于twitter,我还可以看到http_twitter.com_0和https_twitter.com_0

在这个目录中,所有的文件名都是数字。例如,在文件0中,我找到了一个名为8的文件和另一个名为9的文件。在我的例子中,这些文件是websql数据库。我不知道chrome的
Default/databases
dir中是否也有索引数据库

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

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

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

sqlite3 Databases.db
显然,一旦进入sqlite3外壳,就很容易掌握一些SQL知识。不管怎样,它也总是很方便,可以通过命令获得一些帮助

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

select * from Databases;
我们可以看到数据库与其文件之间的映射。比如说

7 | http | jquerymobile.com | 0 | testdb | html5测试db | 200000

8 |文件0 |艾尔法罗开发|艾尔法罗公园达托斯基地| 734003200

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

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

delete from Databases where id = 8
然后从文件系统中删除实际文件(sqlite3外壳外部)

就这样


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

请注意,如果您使用多个

tx.executeSql('DROP TABLE mytable'); 
在同一事务回调中的语句>确保它们都存在,或者考虑使用下拉表(如果存在语法)。如果在尝试删除时,即使一个表不存在,也会导致整个事务失败。此故障会导致事务回滚,并意味着即使您认为应该删除数据,数据仍将保留在数据库中。除非您在executeSql的第4个参数中专门侦听错误,否则不会报告错误
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")
});