web-dev-qa-db-ja.com

WebSQLでデータベースをプログラムで削除する方法は?

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

create a databaseによって

var db = openDatabase('database', '1.0', 'my database', 2 * 1024 * 1024);

そして、私はcreate a tableこれにより

db.transaction(function (tx) {
  tx.executeSql('CREATE TABLE IF NOT EXISTS mytable (blah,blah)');
});

deletetableによって

db.transaction(function (tx) {
  tx.executeSql('DROP TABLE mytable');
});

しかし、プログラムでdatabaseを削除する方法はありますか?

49

仕様 言います:

4.1データベース

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

46
serg

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

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

chrome://settings/cookies

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

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

48
i_a

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データベースと、各Originのディレクトリが表示されます。これらのディレクトリには、protocol_Host_somenumberというパターンで名前が付けられています(その番号はわかりません)。たとえば、私の場合、私のアプリはGoogleで開くファイルであるため、Chrome file:///…プロトコルで、file__0ディレクトリが表示されます。Twitterと私はまた、http_Twitter.com_0およびhttps_Twitter.com_0も表示できます。

このディレクトリ内では、すべてのファイル名は単なる数字です。たとえば、file__0の中に8という名前のファイルと9という名前のファイルが見つかりました。私の場合、これらのファイルはwebsqlデータベースです。 Chromeの_ [にインデックス付きDBデータベースもあるかどうかわかりませんDefault/databases dir。

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

幸いなことに、前に述べたDatabases.dbは、番号が付けられたファイルとデータベースの間のマッピングです。

Sqlite3コマンドを使用して、Databases.dbおよびその他のWeb SQLファイルを開くことができます。

sqlite3 Databases.db

明らかに、一度sqlite3シェルに入ると、SQLの知識があると便利です。とにかく、それは常にいくつかの助けも便利です、それはコマンドを介して利用可能です

.help

コマンド.tablesデータベース内のテーブルをリストできます。このDatabases.db内には、データベースとメタのテーブルがあります。重要なのはデータベースなので、

select * from Databases;

データベースとそのファイル間のマッピングを確認できます。例えば

7 | http_jquerymobile.com_0 | testdb | html5 test db | 200000

8 | file__0 | elfaro_dev |デファロデデエルファロパラデサロロ| 734003200

最初の列はテーブルのidです。これはdbファイル名に使用される番号です。2番目はOrigin(ディレクトリ)です。他の列はdbから作成するときに使用されるdb名、dbの説明、推定サイズです。 Javascript API。

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

delete from Databases where id = 8

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

rm file__0/8

以上です。

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

13
hisa_py

開発者向けオプション

データベースをプログラムで(まだ)列挙または削除する方法はありません。
Chrome開発者はchrome://settings/cookiesデータベースの検索と削除Opera開発者はopera://settings/cookies

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

新しい Spec は、応答ヘッダーとjavascriptの両方でfeatureでこれが可能である可能性があることを示しています。 短所は、何を削除するかを制御できないことです。そのため、すべてをクリアする場合を除き、最初にバックアップを作成する必要があります。

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

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

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")
});
7
Endless

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

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

ただし、ファイルを見つけて削除することはできますが、データは残ります。 Chromeオープンとクローズの両方で、すべてのchromeプロセスが終了しましたが、ブラウザインスペクタは不要なすべての古いデータベースを表示し続けますその中のフィールドとデータ。

7
Wytze

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

要約する:

  • 現在、WebSQLデータベースを削除する方法はありません。
  • おそらく、代わりにIndexed DBまたはlocalStorageを使用してください。
3
Boris Smus

my library 実装では、すべてのテーブルを削除するだけです。実際、データベースを削除します。テーブルのリストはselect * from sqlite_master

3
Kyaw Tun

複数使用する場合は注意してください

tx.executeSql('DROP TABLE mytable'); 

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

0
JimTheDev