我是 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
?
答案 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中得到解答。
总结:
答案 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方法首先检查是否存在具有相同名称的数据库。如果不存在,它将创建一个,否则它将打开现有的