53

私はWeb SQL データベースを初めて使用し、Web ページのローカル データベースにデータを保存するために使用しています。

 私はデータベース作成することができます

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ますか?

4

9 に答える 9

51

PersistenceJS を使用すると、データベースを完全に消去する persistence.reset API があります。 PersistenceJS サイト

開発/テスト目的で、Chrome で次の URL でドメイン名を検索して、コンテンツを表示し、webSQL、IndexedDB、Cookie などを削除できます。

chrome://settings/cookies

そこでは、ドメインのすべてのストレージまたは特定のローカル ストレージ エンティティのみを削除できます。はい、URL は単に「Cookie」を意味しますが、この URL のインターフェイスにはすべての種類のオフライン ストレージが含まれています。

Chrome 開発者ツール インターフェイスに、[リソース] タブのデータ ストレージ エンティティを右クリックして削除し、コンテンツを検査する機能があれば素晴らしいと思います。しかし今のところ、私が知っているのは設定/クッキーの URL だけです。

于 2013-03-25T13:39:09.390 に答える
46

仕様は次のように述べています。

4.1 データベース

各オリジンには、関連付けられた一連のデータベースがあります。各データベースには、名前と現在のバージョンがあります。この API からオリジンで利用可能なデータベースを列挙または削除する方法はありません。

于 2011-08-24T22:34:09.047 に答える
14

私は、persistencejs を介した web sql と BDD 用の jasmine js を使用して、オフライン ストレージを備えた phonegap+jquery-mobile+KO アプリを開発しています。

各仕様の後に実行されるある種の「データベースクリーナー」に取り組んでいます。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 データベースです。クロムのディレクトリにインデックス付き DB データベースもあるかどうかはわかりませんDefault/databases

この名前では、どのデータベースが何であるかを推測するのは少し困難です。データベースを開くと、そのテーブルとデータからアプリまたはサイトを推測する必要があります。

幸いなことに、前に述べた 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 テスト データベース|200000

8|file__0|elfaro_dev|ElFaro のデータ ベース|734003200

最初の列は、db ファイル名に使用される番号であるテーブルの ID です。2 番目の列は、原点 (ディレクトリ) です。他の列は、db 名、db の説明、および db から db を作成するときに使用される推定サイズです。 JavaScript API。

したがって、実際にデータベースを削除するには、このテーブルからデータベースを削除しました。たとえば、次のようになります。

delete from Databases where id = 8

そして、ファイルシステムから実際のファイルを削除します(sqlite3シェルの外部)

rm file__0/8

以上です。

PS:これは単純な主題には長すぎる答えであることはわかっていますが、システムからこれをフラッシュして、SOやブログなどの場所にバックアップする必要がありました。

于 2014-01-17T19:55:58.710 に答える
9

開発者向けオプション

プログラムでデータベースを列挙または削除する方法は (まだ) ありません。
Chrome 開発者はナビゲートしchrome://settings/cookiesて、Opera 開発者がナビゲートできるデータベースを検索および削除できますopera://settings/cookies

データベース (およびその他すべて) を完全に削除する唯一の方法

新しい仕様によると、応答ヘッダーと JavaScript の両方を備えた機能でこれが可能になる可能性があります。欠点は、削除されるものを制御できないことです。そのため、すべてを消去したい場合を除き、何よりもまずバックアップを作成する必要があります

2.1.3. ストレージ パラメータ

storage パラメーターは、サーバーが特定の応答の URL の発信元に関連付けられたローカルに保存されたデータを削除することを望んでいることを示します。これには、( localStorage 、 sessionStorage 、 [INDEXEDDB] 、 [WEBDATABASE] など) などのストレージメカニズムと、サービスワーカー登録などの接線関連のメカニズムが含まれます。

J:

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")
});
于 2015-10-03T21:11:31.523 に答える
7

localdatabase ファイルは、[アプリケーション データ] > [Google] > [Chrome] > [ユーザー データ] > [デフォルト] > [データベース] の下の Windows ユーザー設定に保存されます。

したがって、それらを手動で削除することは理論的には可能です。これは、自分のコンピューターでテスト/開発している場合にのみ役立ちます。別のユーザーがアプリ/サイトを開いたときに、ファイル システムにアクセスする可能性は低いためです。

ただし、ファイルを見つけて削除しても、データは残ります。Chrome を開いた状態と閉じた状態の両方で試してみましたが、すべての Chrome プロセスが終了しましたが、ブラウザーのインスペクターは不要なフィールドとデータがすべて含まれている古いデータベースを表示し続けます。

于 2012-06-07T10:09:57.973 に答える
3

これはHTML5 データベース ストレージ (SQL lite) - いくつかの質問で回答されています。

要約する:

  • 現在、WebSQL データベースを削除する方法はありません。
  • おそらく、代わりにインデックス付き DB または localStorage を使用してください。
于 2011-08-24T22:34:56.037 に答える
3

ライブラリの実装では、すべてのテーブルを削除するだけです。確かに、データベースを削除します。テーブルのリストはselect * from sqlite_master.

于 2013-08-25T12:58:14.153 に答える
0

複数ご利用の場合はご注意ください

tx.executeSql('DROP TABLE mytable'); 

同じトランザクション コールバック内のステートメントがすべて存在することを確認するか、代わりに DROP TABLE IF EXISTS 構文の使用を検討してください。ドロップしようとしたときにテーブルが 1 つでも存在しないと、トランザクション全体が失敗します。この失敗により、トランザクションがロールバックされ、削除されるべきだと思っていたデータがデータベースに残ることになります。エラー コールバックである executeSql の 4 番目の引数で具体的にリッスンしない限り、エラーは報告されません。これは意図された動作ですが、私の経験では混乱を招きます。

于 2015-06-25T20:20:26.400 に答える