Как удалить базу данных в WebSQL программно? - PullRequest
49 голосов
/ 25 августа 2011

Я новичок в База данных Web SQL и использую его для сохранения данных в локальной базе данных на веб-странице.

Я могу создать a база данных от

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

, и я могу создать a , сделав это

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

Я могу удалить таблицу

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

но есть ли способ удалить database программно?

Ответы [ 9 ]

48 голосов
/ 25 марта 2013

Используя PersistenceJS, существует API persistence.reset, который очистит базу данных. PersistenceJS Site

В целях разработки / тестирования вы можете просматривать контент и удалять webSQL, IndexedDB, файлы cookie и т. Д., Выполняя поиск вашего доменного имени по этому URL в Chrome:

chrome://settings/cookies

Там вы можете удалить все хранилище для домена или только некоторые локальные объекты хранилища.Да, URL подразумевает только «куки», но интерфейс по этому URL включает в себя все типы автономного хранилища.

Было бы здорово, если бы интерфейс инструментов разработчика Chrome имел возможность щелкать правой кнопкой мыши и удалятьобъект хранения данных на вкладке Ресурсы вместе с проверкой содержимого.Но пока все, что я знаю, это URL настроек / файлов cookie.

46 голосов
/ 25 августа 2011

Spec говорит:

4.1 Базы данных

Каждый источник имеет связанный набор баз данных. У каждой базы данных есть имя и текущая версия. Нет способа перечислить или удалить базы данных , доступные для источника из этого API.

13 голосов
/ 17 января 2014

Я занимаюсь разработкой приложения phonegap + jquery-mobile + KO с автономным хранилищем, используя web sql через persistencejs и jasmine js для BDD.

Я работаю над своего рода «очистителем базы данных», который будет выполняться после каждой спецификации. Когда я искал, как удалить базу данных web sql, я прочитал ответ https://stackoverflow.com/a/10929725/667598 (в этой теме / вопросе) и пошел посмотреть, что находится в этом каталоге (Mac OS X).

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

Внутри вы увидите базу данных Dite.db SQLite3 и каталоги для каждого источника. Эти каталоги именуются с помощью шаблона protocol_host_somenumber (я не знаю, что это за номер). Так, например, в моем случае, поскольку мои приложения - это просто файлы, которые я открываю в Google Chrome с протоколом file: ///…, я могу видеть каталог file__0. И для твиттера, и я также могу увидеть http_twitter.com_0 и https_twitter.com_0.

Внутри этих каталогов все имена файлов являются просто числами. Например, внутри файла __0 я нашел файл с именем 8, а другой - с именем 9. В моем случае это файлы базы данных websql. Я не знаю, есть ли базы данных Indexed DB в chrome Default/databases dir.

С этими именами немного сложно догадаться, что это за база данных. Вы можете открыть базу данных, и вам придется выводить приложение или сайт через их таблицы и данные.

К счастью, упомянутый выше файл Databases.db представляет собой сопоставление файлов с именами с номерами и базами данных.

Вы можете открыть файл Databases.db и любой другой веб-файл sql с помощью команды sqlite3

sqlite3 Databases.db

Очевидно, что, попав в оболочку sqlite3, полезно иметь некоторые знания SQL. В любом случае, это также всегда полезная помощь, которая доступна через команду

.help

С помощью команды .tables вы можете просмотреть таблицы в базе данных. Внутри этого Databases.db мы можем найти таблицы Databases и meta. Важным является Базы данных, поэтому с

select * from Databases;

мы можем видеть соответствие между базами данных и их файлами. Например

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

8 | file__0 | elfaro_dev | База данных ElFaro para desarrollo | 734003200

Первый столбец - это идентификатор таблицы, который является номером, используемым для имен файлов БД, второй - это источник (каталог), другие столбцы - это имя БД, описание БД и предполагаемый размер, использованный при создании БД из Javascript API.

Таким образом, чтобы фактически удалить базу данных, я удалил ее из этой таблицы, например:

delete from Databases where id = 8

А затем удалить сам файл из файловой системы (вне оболочки sqlite3)

rm file__0/8

И это все.

PS: Я знаю, что это слишком длинный ответ для простой темы, но мне просто нужно было стереть это из моей системы и создать резервную копию где-нибудь вроде SO или блога.

7 голосов
/ 04 октября 2015

Параметры разработчика

Нет способа перечислить или удалить базы данных программно (пока).
Разработчики Chrome могут перейти к chrome://settings/cookies поиску и удалению любой базы данных. Разработчики Opera могут перейти к opera://settings/cookies

Единственный способ действительно удалить базу данных (и все остальное)

Новый Spec говорит, что это возможно в функции с заголовком ответа и javascript. недостатками является то, что вы не можете контролировать то, что удаляется, поэтому вам нужно сначала создать резервную копию, если вы не хотите очистить все

2.1.3. Параметр хранения

Параметр хранения указывает, что сервер желает удалить локально сохраненные данные, связанные с источником определенного URL-адреса ответа. Это включает в себя механизмы хранения, такие как ( localStorage, sessionStorage, [INDEXEDDB], [WEBDATABASE] и т. Д. ), а также тангенциально связанный механизм, такой как регистрация сервисных работников.

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 голосов
/ 07 июня 2012

Файлы локальной базы данных хранятся в пользовательских настройках Windows в разделе «Данные приложения»> «Google»> «Chrome»> «Данные пользователя»> «По умолчанию»> базы данных.

Таким образом, удаление их вручную теоретически возможно.Это полезно только при тестировании / разработке на вашем собственном компьютере, поскольку, когда другой пользователь открывает ваше приложение / сайт, он вряд ли получит доступ к файловой системе.

Однако, даже если вы можете найти файлы и удалить их, данные держатся вокруг.Я пробовал это с открытым и закрытым Chrome, и все процессы Chrome были завершены, но инспектор браузера продолжает показывать мне мою старую базу данных со всеми нежелательными полями и данными в ней.

3 голосов
/ 25 августа 2013

В моей библиотеке реализация, я просто удаляю все таблицы.Которые, действительно, удаляют базу данных.Список таблиц: select * from sqlite_master.

3 голосов
/ 25 августа 2011

Ответ в Хранилище базы данных HTML5 (SQL lite) - несколько вопросов .

Подведем итог:

  • В настоящее время нет возможности удалить базу данных WebSQL.
  • Возможно, вместо этого используйте Indexed DB или localStorage.
0 голосов
/ 25 июня 2015

Обратите внимание, что если вы используете несколько

tx.executeSql('DROP TABLE mytable'); 
Затем операторы

в одном и том же обратном вызове транзакции должны убедиться, что все они существуют, или рассмотреть возможность использования вместо этого синтаксиса DROP TABLE IF EXISTS. Если даже одна таблица не существует, когда вы пытаетесь удалить ее, это приведет к сбою всей транзакции. Этот сбой приводит к откату транзакции и означает, что данные останутся в вашей базе данных, даже если вы думали, что они должны быть удалены. Об ошибке не сообщается, если вы специально не прослушиваете ее в 4-м аргументе executeSql, который является обратным вызовом ошибки. Это намеренное поведение, но, по моему опыту, сбивает с толку.

0 голосов
/ 22 августа 2013

Нет способа удалить существующую базу данных в websql, он будет очищен при очистке кэша или
Браузер закрыт.Если вы хотите создать базу данных с тем же именем, просто используйте метод openDatabase. Сначала он проверит существование базы данных с тем же именем.Если он не существует, он создаст его, в противном случае он откроет существующий

, перейдите по этой ссылке http://html5doctor.com/introducing-web-sql-databases/

...