Как удалить базу данных в WebSQL программно? - программирование
Подтвердить что ты не робот

Как удалить базу данных в WebSQL программно?

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

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

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

и я могу создать таблицу , выполнив это

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

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

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

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

4b9b3361

Ответ 1

Spec говорит:

4.1 Базы данных

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

Ответ 2

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

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

chrome://settings/cookies

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

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

Ответ 3

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

Я работаю над каким-то "очистителем базы данных", который будет выполняться после каждой спецификации. Когда я искал, как удалить базу данных web sql, я прочитал ответ fooobar.com/questions/118958/... (в этом потоке/вопросе) и пошел посмотреть, что в этом каталоге ( Mac OS X).

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

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

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

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

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

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

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

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

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

delete from Databases where id = 8

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

rm file__0/8

И что это.

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

Параметр сохранения указывает, что сервер хочет удалить локально сохраненные данные, связанные с источником конкретного 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 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

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

Ответ 8

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

tx.executeSql('DROP TABLE mytable'); 

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

Ответ 9

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

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