wake-up-neo.com

So löschen Sie eine Datenbank programmgesteuert in WebSQL

Ich bin neu in der Web SQL-Datenbank und verwende sie zum Speichern von Daten in einer lokalen Datenbank in einer Webseite.

Ich kannerstellenaDatenbankdurch

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

und ich kannerstellenatableauf diese Weise

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

Ich kannlöschendieTabelledurch

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

Aber gibt es eine Möglichkeit, diedatabaseprogrammgesteuert zu löschen?

47

Spec sagt:

4.1 Datenbanken

Jedem Origin sind mehrere Datenbanken zugeordnet. Jede Datenbank hat einen Namen und eine aktuelle Version. Es gibt keine Möglichkeit, die Datenbanken aufzulisten oder zu löschen für ein Origin aus dieser API verfügbar.

45
serg

Bei Verwendung von PersistenceJS gibt es eine Persistence.reset-API, mit der die Datenbank bereinigt wird . PersistenceJS Site

Zu Entwicklungs-/Testzwecken können Sie Inhalte anzeigen und webSQL, IndexedDB, Cookies usw. löschen, indem Sie Ihren Domänennamen unter dieser URL in Chrome suchen: 

chrome://settings/cookies

Dort können Sie den gesamten Speicher für eine Domäne oder nur bestimmte lokale Speicherentitäten löschen. Ja, die URL impliziert nur "Cookies", aber die Benutzeroberfläche unter dieser URL umfasst alle Arten von Offline-Speicher.

Ich denke, es wäre großartig, wenn die Benutzeroberfläche der Chrome-Entwicklertools auf der Registerkarte Ressourcen mit der rechten Maustaste klicken und eine Datenspeicherungseinheit löschen sowie den Inhalt überprüfen konnte. Aber vorerst kenne ich nur die URL für Einstellungen/Cookies.

48
i_a

Ich entwickle eine phonegap + jquery-mobile + KO-App mit Offline-Speicherung mit Web-SQL über persistencejs und jasmin js für BDD.

Ich arbeite an einer Art "Datenbank-Bereinigung", die nach jeder Spezifikation ausgeführt wird. Als ich nach dem Löschen einer Web-SQL-Datenbank suchte, las ich die Antwort https://stackoverflow.com/a/10929725/667598 (in diesem Thread/in dieser Frage) und ging nach dem Inhalt dieses Verzeichnisses ( Mac OS X).

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

Darin finden Sie eine SQLite3-Datenbank für Datenbanken.db und Verzeichnisse für jedes Origin. Diese Verzeichnisse werden mit dem Muster protocol_Host_somenumber benannt (ich weiß nicht, was diese Nummer ist). In meinem Fall kann ich zum Beispiel, da meine Apps nur Dateien sind, die ich in Google Chrome mit dem Protokoll file: ///… öffne, ein Verzeichnis file__0 sehen. Und für Twitter kann ich auch ein http_Twitter.com_0 und ein https_Twitter.com_0 sehen.

In diesen Verzeichnissen sind alle Dateinamen nur Zahlen. In file__0 habe ich zum Beispiel eine Datei mit dem Namen 8 und eine weitere mit dem Namen 9 gefunden. In meinem Fall handelt es sich bei diesen Dateien um eine Websql-Datenbank. Ich weiß nicht, ob es in Default/databases dir auch indexierte DB-Datenbanken gibt.

Mit diesen Namen ist es etwas schwer zu erraten, welche Datenbank welche ist. Sie können die Datenbank öffnen, und Sie müssen die App oder Site über ihre Tabellen und Daten ableiten.

Glücklicherweise ist die zuvor erwähnte Datenbank.db eine Zuordnung zwischen den mit Nummern bezeichneten Dateien und den Datenbanken.

Sie können die Datenbank.db und jede andere Web-SQL-Datei mit dem Befehl sqlite3 öffnen

sqlite3 Databases.db

Sobald Sie sich in der sqlite3-Shell befinden, ist es offensichtlich, dass Sie SQL-Kenntnisse haben. Auf jeden Fall ist es auch immer etwas Hilfe, die über den Befehl verfügbar ist

.help

Mit dem Befehl .tables können Sie Tabellen in der Datenbank auflisten. In dieser Datenbank finden Sie die Tabellen Datenbanken und Meta. Das Wichtigste sind Datenbanken, also mit a 

select * from Databases;

wir können die Zuordnung zwischen den Datenbanken und ihren Dateien sehen. Zum Beispiel

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

8 | file__0 | elfaro_dev | Datenbasis für ElFaro para desarrollo | 734003200

Die erste Spalte ist die ID der Tabelle, die für die Datenbankdateinamen verwendet wird. Die zweite Spalte ist der Ursprung (das Verzeichnis). Die anderen Spalten sind der Datenbankname, die Datenbankbeschreibung und die geschätzte Größe, die beim Erstellen der Datenbankdatei verwendet wird Javascript API.

Um eine Datenbank tatsächlich zu löschen, musste ich sie beispielsweise aus dieser Tabelle löschen:

delete from Databases where id = 8

Und dann die eigentliche Datei aus dem Dateisystem löschen (außerhalb der sqlite3-Shell)

rm file__0/8

Und das ist es.

PS: Ich weiß, das ist eine zu lange Antwort für ein einfaches Thema, aber ich musste dieses einfach aus meinem System löschen und es an einem anderen Ort wie SO oder einem Blog sichern. 

13
hisa_py

Die localdatabase-Dateien werden in Ihren Windows-Benutzereinstellungen unter Anwendungsdaten> Google> Chrome> Benutzerdaten> Standard> Datenbanken gespeichert.

Das manuelle Löschen ist also theoretisch möglich. Dies ist nur beim Testen/Entwickeln auf Ihrem eigenen Computer hilfreich. Wenn ein anderer Benutzer Ihre App/Site öffnet, ist es unwahrscheinlich, dass er Zugriff auf das Dateisystem hat.

Auch wenn Sie die Dateien finden und löschen können, bleiben die Daten erhalten. Ich habe es mit Chrome sowohl offen als auch geschlossen ausprobiert und alle Chrome-Prozesse waren beendet. Der Browser-Inspector zeigt mir jedoch weiterhin meine alte Datenbank mit allen unerwünschten Feldern und Daten an.

7
Wytze

Die Entwickleroptionen

Es gibt keine Möglichkeit, die Datenbanken (noch) programmatisch aufzuzählen oder zu löschen.
Chrome-Entwickler können zu chrome://settings/cookies suchen und jede Datenbank löschen Opera-Entwickler können zu opera://settings/cookies navigieren.

Die einzige Möglichkeit, eine Datenbank wirklich zu löschen (und alles andere)

Eine neue Spec besagt, dass dies im feature sowohl mit dem Antwortheader als auch mit dem Javascript möglich ist .. _. Die Nachteile bedeutet, dass Sie nicht kontrollieren können, was gelöscht wird Sie müssen also zuerst ein Backup erstellen, es sei denn, Sie möchten alles löschen

2.1.3. Der Speicherparameter

Der Speicherparameter gibt an, dass der Server lokal gespeicherte Daten entfernen möchte, die dem Ursprung der URL einer bestimmten Antwort zugeordnet sind. Dies umfasst Speichermechanismen wie (localStorage, sessionStorage, [INDEXEDDB], [WEBDATABASE], usw.) sowie tangential verwandte Mechanismen wie z. B. Service Worker-Registrierungen.

Js:

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

Antwortheader:

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

Dies ist jedoch noch nicht für jeden Browser verfügbar ...

Beste Lösung für Kunden (nicht die Entwickler)

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

}

Verwendungszweck

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

Dies wird in HTML5-Datenbankspeicher (SQL lite) beantwortet - einige Fragen .

Zusammenfassen: 

  • Derzeit keine Möglichkeit, eine WebSQL-Datenbank zu löschen.
  • Verwenden Sie stattdessen wahrscheinlich Indexed DB oder localStorage.
3
Boris Smus

In meiner Bibliothek Implementierung lösche ich einfach alle Tabellen. Welches in der Tat die Datenbank löschen. Liste der Tabellen ist select * from sqlite_master.

3
Kyaw Tun

Bitte beachten Sie dies, wenn Sie mehrere verwenden 

tx.executeSql('DROP TABLE mytable'); 

anweisungen im gleichen Transaktionsrückruf stellen dann sicher, dass sie alle vorhanden sind, oder ziehen stattdessen die Verwendung der DROP TABLE IF EXISTS-Syntax in Betracht. Wenn beim Löschen nicht einmal eine Tabelle vorhanden ist, schlägt die gesamte Transaktion fehl. Dieser Fehler führt zu einem Rollback der Transaktion und bedeutet, dass die Daten in Ihrer Datenbank verbleiben, auch wenn Sie der Meinung waren, dass sie gelöscht worden sein sollten. Es wird kein Fehler gemeldet, wenn Sie nicht ausdrücklich im vierten Argument von executeSql darauf achten, was ein Fehlerrückruf ist. Dies ist beabsichtigtes Verhalten, aber nach meiner Erfahrung verwirrend.

0
JimTheDev