[英]How to delete a database in WebSQL programmatically?
我是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
?
使用PersistenceJS有一個persistence.reset API,可以清理數據庫。 PersistenceJS網站
出於開發/測試目的,您可以通過在Chrome中的此URL搜索您的域名來查看內容並刪除webSQL,IndexedDB,Cookie等:
chrome://settings/cookies
在那里,您可以刪除域的所有存儲或僅刪除某些本地存儲實體。 是的,URL僅表示“cookies”,但此URL處的界面包括所有類型的脫機存儲。
如果Chrome開發人員工具界面能夠在“資源”選項卡中右鍵單擊並刪除數據存儲實體並檢查內容,那就太棒了。 但就目前而言,我所知道的是設置/ cookie URL。
規格說:
4.1數據庫
每個來源都有一組相關的數據庫。 每個數據庫都有一個名稱和當前版本。 無法枚舉或刪除此API中可用於源的數據庫 。
我正在開發一個帶有離線存儲的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里面我們可以找到表數據庫和元數據。 重要的是數據庫,所以用a
select * from Databases;
我們可以看到數據庫和它們的文件之間的映射。 例如
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
然后從文件系統中刪除實際文件(在sqlite3 shell之外)
rm file__0/8
就是這樣。
PS: 我知道這對於一個簡單的主題來說是一個太長的答案,但我只需要從我的系統中清除它並將其備份到某個地方,如SO或博客。
localdatabase文件存儲在Windows數據庫> Google> Chrome>用戶數據>默認>數據庫下的Windows用戶設置中。
因此理論上可以手動刪除它們。 這僅在您自己的計算機上進行測試/開發時很有用,因為當另一個用戶打開您的應用程序/站點時,它不太可能具有文件系統訪問權限。
但是,即使您可以找到並刪除它們,數據仍然存在。 我已經嘗試過Chrome打開和關閉以及所有Chrome進程都已結束,但瀏覽器檢查程序一直向我顯示我的舊數據庫,其中包含所有不需要的字段和數據。
無法以編程方式枚舉或刪除數據庫(尚未)。
Chrome開發人員可以導航到chrome://settings/cookies
搜索並刪除任何數據庫Opera開發人員可以導航到opera://settings/cookies
新規格說,這可能與兩響應頭和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")
});
在我的庫實現中,我只刪除所有表。 確實,刪除數據庫。 表的列表是select * from sqlite_master
中select * from sqlite_master
。
請注意,如果您使用多個
tx.executeSql('DROP TABLE mytable');
然后在同一事務回調中的語句確保它們都存在或考慮使用DROP TABLE IF EXISTS語法。 如果您嘗試刪除它時甚至不存在一個表將導致整個事務失敗。 此失敗導致事務回滾,這意味着即使您認為數據已被刪除,數據也將保留在您的數據庫中。 除非您在executeSql的第4個參數中專門偵聽它,否則不會報告錯誤,這是一個錯誤回調。 這是預期的行為,但根據我的經驗,這是令人困惑的。
沒有方法刪除websql中的現有數據庫,它將在清除緩存時清除
瀏覽器已關閉。 如果要創建具有相同名稱的數據庫,請使用openDatabase方法首先檢查是否存在具有相同名稱的數據庫。 如果不存在,它將創建一個,否則它將打開現有的一個
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.