簡體   English   中英

如何以編程方式刪除WebSQL中的數據庫?

[英]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_masterselect * from sqlite_master

這在HTML5數據庫存儲(SQL lite)中得到了解答 - 幾乎沒有問題

總結一下:

  • 目前無法刪除WebSQL數據庫。
  • 可能改為使用Indexed DB或localStorage。

請注意,如果您使用多個

tx.executeSql('DROP TABLE mytable'); 

然后在同一事務回調中的語句確保它們都存在或考慮使用DROP TABLE IF EXISTS語法。 如果您嘗試刪除它時甚至不存在一個表將導致整個事務失敗。 此失敗導致事務回滾,這意味着即使您認為數據已被刪除,數據也將保留在您的數據庫中。 除非您在executeSql的第4個參數中專門偵聽它,否則不會報告錯誤,這是一個錯誤回調。 這是預期的行為,但根據我的經驗,這是令人困惑的。

沒有方法刪除websql中的現有數據庫,它將在清除緩存時清除
瀏覽器已關閉。 如果要創建具有相同名稱的數據庫,請使用openDatabase方法首先檢查是否存在具有相同名稱的數據庫。 如果不存在,它將創建一個,否則它將打開現有的一個

請點擊此鏈接http://html5doctor.com/introducing-web-sql-databases/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM