web-dev-qa-db-fra.com

Comment supprimer une base de données dans WebSQL par programme?

La base de données Web SQL est nouvelle pour moi et je l’utilise pour enregistrer des données dans une base de données locale dans une page Web.

Je peux créer un base de données de

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

et je peux créer un table en faisant cela

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

Je peux supprimer le table de

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

mais existe-t-il un moyen de supprimer le database par programme?

47
Derek 朕會功夫

Spec dit:

4.1 Bases de données

Chaque origine est associée à un ensemble de bases de données. Chaque base de données a un nom et une version actuelle. Il n'y a aucun moyen d'énumérer ou de supprimer les bases de données disponible pour une origine à partir de cette API.

45
serg

À l’aide de PersistenceJS, il existe une API persistence.reset qui va effacer la base de données. . Site PersistenceJS

À des fins de développement/test, vous pouvez afficher le contenu et supprimer webSQL, IndexedDB, les cookies, etc. en recherchant votre nom de domaine à cette adresse URL dans Chrome: 

chrome://settings/cookies

Là, vous pouvez supprimer tout le stockage d'un domaine ou seulement certaines entités de stockage locales. Oui, l'URL n'implique que des "cookies", mais l'interface de cette URL inclut tous les types de stockage hors connexion.

Ce serait formidable si l'interface des outils de développement de Chrome permettait de cliquer avec le bouton droit de la souris et de supprimer une entité de stockage de données dans l'onglet Ressources tout en inspectant le contenu. Mais pour l'instant, tout ce que je sais, c'est l'URL des paramètres/cookies.

48
i_a

Je développe une application phonegap + jquery-mobile + KO avec stockage hors ligne à l'aide de Web SQL via persistencejs et jasmine js pour BDD.

Je travaille sur une sorte de "nettoyeur de base de données" à exécuter après chaque spécification. Lorsque je cherchais comment déposer une base de données SQL Web, j’ai lu la réponse https://stackoverflow.com/a/10929725/667598 (dans ce fil/cette question) et suis allé voir le contenu de ce répertoire ( Mac OS X).

cd ~/Library/Application\ Support/Google/Chrome/Default/databases

À l'intérieur, vous verrez une base de données SQLite3 Databases.db et des répertoires pour chaque origine. Ces répertoires sont nommés avec le modèle protocol_Host_somenumber (je ne sais pas quel est ce numéro). Ainsi, par exemple, dans mon cas, comme mes applications ne sont que des fichiers que j’ouvre dans Google Chrome avec le protocole file: ///…, je peux voir un répertoire file__0. Et pour Twitter, je peux aussi voir un http_Twitter.com_0 et un https_Twitter.com_0.

Dans ces répertoires, tous les noms de fichiers ne sont que des chiffres. Par exemple, dans fichier__0, j'ai trouvé un fichier nommé 8 et un autre nommé 9. Dans mon cas, ces fichiers sont une base de données websql. Je ne sais pas s'il existe également des bases de données indexées dans le répertoire Default/databases de chrome.

Avec ces noms, il est un peu difficile de deviner quelle base de données est quoi. Vous pouvez ouvrir la base de données et vous devrez en déduire l'application ou le site via ses tables et ses données.

Heureusement, le fichier Databases.db que j'ai mentionné précédemment est un mappage entre les fichiers nommés avec des nombres et les bases de données.

Vous pouvez ouvrir le fichier Databases.db et tout autre fichier Web SQL à l’aide de la commande sqlite3.

sqlite3 Databases.db

De toute évidence, une fois dans le shell sqlite3, il est utile d’avoir des connaissances en SQL. Quoi qu'il en soit, il est toujours utile d'avoir de l'aide, qui est disponible via la commande

.help

Avec la commande .tables, vous pouvez lister les tables de la base de données. Dans ce fichier Databases.db, vous pouvez trouver les tables Databases and meta. L'important est la base de données, donc avec un 

select * from Databases;

nous pouvons voir le mappage entre les bases de données et leurs fichiers. Par exemple

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

8 | file__0 | elfaro_dev | Base de données ElFaro pour le développement | 734003200

La première colonne est l'id de la table qui est le numéro utilisé pour les noms de fichier de base de données, la seconde est l'origine (le répertoire), les autres colonnes sont le nom de la base de données, sa description et la taille estimée utilisée lors de la création de la base de données. API Javascript.

Donc, pour réellement supprimer une base de données, ce que j'ai fait a été de le supprimer de cette table, par exemple:

delete from Databases where id = 8

Et puis supprimez le fichier actuel du système de fichiers (en dehors de sqlite3 Shell)

rm file__0/8

Et c'est tout.

PS: _ {Je sais que c'est une réponse trop longue pour un sujet simple, mais je devais simplement le vider de mon système et le sauvegarder quelque part, comme SO ou un blog. 

13
hisa_py

Les fichiers de la base de données locale sont stockés dans vos paramètres utilisateur Windows sous Données de l'application> Google> Chrome> Données de l'utilisateur> Par défaut> bases de données.

Donc, les supprimer manuellement est théoriquement possible. Cela n’est utile que lorsque vous testez/développez sur votre propre ordinateur, car lorsqu’un autre utilisateur ouvre votre application/site, il est peu probable qu’il dispose d’un accès au système de fichiers.

Cependant, même si vous pouvez trouver les fichiers et les supprimer, les données restent. Je l'ai essayé avec Chrome, qu'il soit ouvert ou fermé, et que tous les processus de chrome soient terminés. Pourtant, l'inspecteur de navigateur ne cesse de me montrer mon ancienne base de données contenant tous les champs et toutes les données indésirables.

7
Wytze

Les options du développeur

Il n'y a aucun moyen d'énumérer ou de supprimer les bases de données par programme (pour le moment).
Les développeurs Chrome peuvent accéder à chrome://settings/cookies et supprimer toute base de données Les développeurs Opera peuvent accéder à opera://settings/cookies.

La seule façon de vraiment supprimer une base de données (et tout le reste)

Un nouveau Spec indique que cela pourrait être possible dans feature avec à la fois l'en-tête de réponse et javascript . Le inconvénients est que vous ne pouvez pas contrôler ce qui est en train d'être supprimé. besoin de créer une sauvegarde en premier sauf si vous voulez tout effacer

2.1.3. Le paramètre de stockage

Le paramètre storage indique que le serveur souhaite supprimer les données stockées localement associées à l’origine de l’URL d’une réponse donnée. Cela inclut les mécanismes de stockage tels que (localStorage, sessionStorage, [INDEXEDDB], [WEBDATABASE], etc), ainsi que les mécanismes liés de manière tangentielle tels que les enregistrements de prestataire de services.

Js:

navigator.storage.clear({
    types: [ "storage" ],
    includeSubdomains: true // false by default
});

En-tête de réponse:

res.header("Clear-Site-Data", "storage; includeSubdomains");

Mais ce n'est pas encore disponible pour tous les navigateurs ...

Meilleure solution pour les clients (pas les développeurs)

/* 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);
    });

}

Usage

dropDatabase("database", function(){
    console.log("done")
});
6
Endless

Ceci est résolu dans Stockage de la base de données HTML5 (SQL lite) - quelques questions .

Résumer: 

  • Actuellement, aucun moyen de supprimer une base de données WebSQL.
  • Utilisez probablement à la place Indexed DB ou localStorage.
3
Boris Smus

Dans ma bibliothèque implémentation, je supprime simplement toutes les tables. Ce qui, en effet, supprime la base de données. La liste des tables est select * from sqlite_master.

3
Kyaw Tun

Veuillez noter que si vous utilisez plusieurs 

tx.executeSql('DROP TABLE mytable'); 

puis, assurez-vous qu’ils existent tous ou envisagez plutôt d’utiliser la syntaxe DROP TABLE IF EXISTS. Si une seule table n'existe pas lorsque vous essayez de la supprimer, la transaction entière échouera. Cette défaillance entraîne une annulation de la transaction et signifie que les données resteront dans votre base de données, même si vous pensiez qu'elles auraient dû être supprimées. Il n'y a pas d'erreur signalée à moins que vous ne l'écoutiez spécifiquement dans le 4ème argument de executeSql qui est un rappel d'erreur. Ceci est le comportement voulu mais, selon mon expérience, est source de confusion.

0
JimTheDev