Comment supprimer une base de données WebSQL par programmation?

je suis nouveau à base de données SQL Web 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 par

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

et je peux créer un table ce faisant

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

je peux supprimer le table par

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

mais y a-t-il un moyen de supprimer la database programmatiquement?

47
demandé sur Derek 朕會功夫 2011-08-25 02:24:54

9 réponses

Spec says:

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 disponibles pour une origine à partir de cette API.

45
répondu serg 2011-08-24 22:34:09

en utilisant la persistance js il y a une persistance.réinitialiser L'API qui effacera la base de données. PersistenceJS Site

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

chrome://settings/cookies

là, vous pouvez supprimer tout le stockage pour un domaine ou juste certaines entités de stockage locales. Oui, L'URL implique juste 'cookies', mais l'interface à cette URL inclut tous les types de stockage hors ligne.

ce serait génial, je pense, que L'interface des outils de développement Chrome ait la possibilité 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
répondu i_a 2015-07-14 20:44:40

je développe une application phonegap+jQuery-mobile+KO avec stockage hors ligne en utilisant 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 spec. Quand je cherchais sur la façon de laisser tomber une base de données sql web j'ai lu la réponse https://stackoverflow.com/a/10929725/667598 (dans ce thread/question), et est allé voir ce qui est dans ce répertoire (Mac OS X).

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

à l'intérieur vous verrez une base de données.base de données db SQLite3, et répertoires pour chaque origine. Ces répertoires sont nommés avec le motif protocol_host_somenumber (Je ne sais pas ce qu'est ce nombre). Par exemple, dans mon cas, puisque 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 et je peux aussi voir un http_twitter.com_0 et un https_twitter.com_0.

dans ce répertoire tous les noms de fichiers sont seulement des nombres. Par exemple, dans le 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 y a aussi des bases de données DB indexées dans le dir Default/databases de chrome.

avec ces noms, il est un peu difficile de deviner ce qu'est une base de données. Vous pouvez ouvrir la base de données et vous devrez inférer l'application ou le site via ses tables et données.

heureusement, les bases de données.db je l'ai mentionné auparavant, c'est une mise en correspondance entre ces les fichiers nommés avec les nombres et les bases de données.

vous pouvez ouvrir les bases de données.db et tout autre fichier sql web avec la commande sqlite3

sqlite3 Databases.db

évidemment, une fois à l'intérieur du shell sqlite3, est pratique pour avoir quelques connaissances en SQL. Quoi qu'il en soit, il est également toujours pratique un peu d'aide, qui est disponible via la commande

.help

avec la commande .tables vous pouvez lister des tables dans la base de données. À l'intérieur de cette base de données.db nous pouvons trouver les tables des Bases de données et de méta. L'important est les bases de données, donc avec un

select * from Databases;

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

7|http_jquerymobile.com_0 / testdb / HTML5 test db / 200000 "1519330920

8 / file _ _ 0|elfaro_dev|Base de datos de ElFaro para desarrollo / 734003200

le premier colonne est l'id de la table qui est le nombre utilisé pour les noms de fichiers db, la seconde est l'origine (le répertoire) les autres colonnes sont le nom de la base de données, la description de la base de données et la taille estimée utilisée lors de la création de la base de données à partir de L'API Javascript.

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

delete from Databases where id = 8

et puis supprimer le fichier actuel du système de fichiers (en dehors de l'interpréteur de commandes sqlite3)

rm file__0/8

Et c'est tout.

PS: je sais que c'est une réponse trop longue pour un sujet simple, mais j'avais juste besoin de débusquer cela de mon système et de le sauvegarder quelque part comme ça ou un blog.

13
répondu hisa_py 2017-05-23 11:47:35

les fichiers localdatabase sont stockés dans les paramètres de L'utilisateur Windows Sous données de l'Application > Google > Chrome > données de l'utilisateur > bases de données par défaut.

donc les supprimer manuellement est théoriquement possible. Ceci 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 ait accès au système de fichiers.

Cependant, même si vous pouvez trouver les fichiers et les supprimer, les clés de données autour. J'ai essayé avec Chrome à la fois ouvert et fermé et tous les processus chrome terminé, et pourtant l'inspecteur de navigateur continue de me montrer mon ancienne base de données avec tous les champs indésirables et les données qu'il contient.

7
répondu Wytze 2012-06-07 10:09:57

options pour les développeurs

il n'y a aucun moyen d'énumérer ou de supprimer les bases de données programmatiquement (encore).

Les développeurs Chrome peuvent naviguer à la recherche chrome://settings/cookies et supprimer n'importe quelle base de données Les développeurs d'Opéra peuvent naviguer vers opera://settings/cookies

Le seul moyen de supprimer une base de données (et tout le reste)

"151980920 Une" nouvelle Spec dit ce pourrait être possible dans le fonctionnalité avec en-tête de réponse et javascript. Le inconvénients est que vous ne pouvez pas contrôler ce qui est supprimé, de sorte que vous auriez besoin de créer une sauvegarde d'abord de tout le reste à moins que vous voulez tout effacer

2.1.3. Le paramètre de stockage

Le stockage paramètre indique que le serveur souhaite supprimer stockés localement les données associées à l'origine d'un particulier url de la réponse. Cela inclut les mécanismes de stockage tels que ( local storage, sessionStorage, [INDEXEDDB], [WEBDATABASE], etc ), ainsi que les mécanismes tangentiellement liés tels que l'enregistrement des travailleurs des 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 encore disponible pour aucun navigateur...

meilleure solution pour les clients (pas la 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);
    });

}

Utilisation

dropDatabase("database", function(){
    console.log("done")
});
6
répondu Endless 2017-01-03 18:53:37

Cette réponse HTML5 stockage de base de données (SQL lite) - quelques questions .

pour résumer:

  • actuellement aucun moyen de laisser tomber une base de données WebSQL.
  • utilise probablement DB indexé ou localStorage à la place.
3
répondu Boris Smus 2017-05-23 10:29:49

Dans ma bibliothèque la mise en œuvre, je viens de supprimer toutes les tables. Qui, en effet, suppriment la base de données. La liste des tableaux est select * from sqlite_master .

3
répondu Kyaw Tun 2013-08-25 12:58:14

veuillez noter que si vous utilisez plusieurs

tx.executeSql('DROP TABLE mytable'); 

déclarations dans la même transaction callback puis s'assurer qu'ils existent tous ou envisager d'utiliser la table de goutte si existe syntaxe à la place. Si une table n'existe pas lorsque vous essayez de tomber entraînera l'échec de toute transaction. Cet échec se traduit par un retour en arrière de la transaction et signifie que les données resteront dans votre base de données même si vous avez pensé qu'il aurait dû être supprimé. Y aucune erreur n'est signalée à moins que vous ne l'écoutiez spécifiquement dans le 4ème argument de l'exécutesql qui est un appel d'erreur. C'est un comportement intentionnel mais, d'après mon expérience, il est déroutant.

0
répondu JimTheDev 2015-06-25 20:20:26

aucune méthode pour supprimer la base de données existante dans websql il se dégagera lorsque le cache est nettoyé ou

Le navigateur est fermé. Si vous voulez créer une base de données avec le même nom il suffit d'utiliser la méthode openDatabase il vérifiera d'abord l'existence de la base de données avec le même nom. S'il n'existe pas il en créera un autrement il ouvrira l'existant

s'il vous plaît suivre ce lien http://html5doctor.com/introducing-web-sql-databases /

-3
répondu Prince V G 2013-08-22 10:08:45