Файлы sqlite можно ли удалять

Обновлено: 05.07.2024

Я хотел бы удалить файл базы данных из Android file system программно? Можно ли запустить оболочку script launch adb , которая по очереди запускает оболочку script в пространстве Android для удаления базы данных? Могу ли я сделать это из тестового примера JUnit (с вызовом system() )?

Как удалить всю базу данных в Android? Мне нужно, чтобы все это исчезло, поэтому я могу протестировать создание базы данных. Я могу отказаться от таблиц, но этого недостаточно. Это находится в эмуляторе, а не на телефоне.

Как только у вас есть Контекст и узнайте имя базы данных, используйте:

Когда эта строка запускается, база данных должна быть удалена.

Убедитесь, что вы закрыли все подключения базы данных перед удалением. В противном случае вам придется перезапустить приложение.

Легко просто ввести из оболочки:

@PeteH В эмуляторе вам не нужно разрешение, но для реального устройства вам понадобится рут Для меня это не потребовало какой-либо специальной настройки. Я имею в виду, конечно, я автоматически вошел в систему как root, но все работало :)

Статический метод SQLiteDatabase.deleteDatabase(File file) был добавлен в API 16. Если вы хотите писать приложения, поддерживающие старые устройства, как вы это делаете?

Я попытался: file.delete();

но он запутывает SQLiteOpenHelper.

NEVER MIND! Позже я понял, что вы используете Контекст.deleteDatabase(). Контекст отлично работает и удаляет журнал. Работает для меня.

Кроме того, я обнаружил, что мне нужно было вызвать SQLiteOpenHelp.close(), прежде чем делать удаление, чтобы затем использовать LoaderManager для его создания.

Также из Eclipse вы можете использовать DDMS, что делает его очень легким.

Просто убедитесь, что ваш эмулятор запущен, а затем переключитесь на перспективу DDMS в Eclipse. У вас будет полный доступ к файловому проводнику, который позволит вам входить и легко удалять всю базу данных.

Работает ли это с реальным устройством телефона? Я не мог видеть никаких подпапок в папке данных при просмотре в режиме DDMS. Но этот вопрос касается удаления базы данных программно?

context.deleteDatabase(DATABASE_NAME); удалит базу данных только в том случае, если все соединения закрыты. Если вы поддерживаете экземпляр singleton для обработки вашего помощника базы данных - легко закрыть открытое соединение.

Если база данных используется в нескольких местах, создавая экземпляр напрямую, файл deleteDatabase + killProcess выполнит эту работу, даже если некоторые соединения открыты. Это можно использовать, если в сценарии приложения нет проблем при перезапуске приложения.

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

В Диспетчере приложений вы можете удалить все приложение с данными. Или просто данные сами. Это включает в себя базу данных.

Перейдите к настройкам.. Вы можете перейти в меню настроек либо в меню ваших приложений или, на большинстве телефонов, потянув уведомление выдвижной ящик и нажав кнопку там.

Выберите подменю Службы. На некоторых телефонах это меню будет иметь немного другое имя, например Application Manager.

Проведите вправо до Список всех приложений. Игнорировать списки запущенных и загружаемых приложений. Вам нужен список всех приложений.

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

Моя первоначальная мысль - удалить файл WAL при запуске приложения. Кажется, прочитав документацию sqlite по этому вопросу, это будет хорошо. Но кто-нибудь знает о каких-либо недостатках для этого?

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

Стоит отметить, что моя база данных Core Data больше кеша. Поэтому неважно, потеряю ли данные данные в WAL. Я действительно должен знать, будет ли база данных полностью повреждена, если я удалю WAL? Мое подозрение - нет, иначе WAL не выполняет одну из своих целей.

спросил(а) 2014-01-07T14:05:00+04:00 7 лет, 10 месяцев назад

Режим WAL имеет проблемы, не используйте его. Проблемы различаются, но очень большой размер вашего отчета один, другие проблемы включают сбой во время миграции (с использованием NSPersistentStoreCoordinators migratePersistentStore) и сбой при импорте журналов транзакций iCloud. Таким образом, пока сообщается о преимуществах, пока эти ошибки не будут исправлены, вероятно, неразумно использовать режим WAL.

И нет, вы не можете удалить журнал записи Ahead, потому что он содержит самые последние данные.

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

Вот выдержка, в которой объясняется, как работает WAL. Если вы не можете гарантировать, что ваше приложение запустило контрольную точку, я не вижу, как вы можете удалить файл WAL, не рискуя удалить совершенные транзакции.

Как работает WAL

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

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

Checkpointing

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

Еще один способ подумать о разнице между откатом и журнал записи-записи - это то, что в подходе с откатом-журналом есть две примитивные операции, чтение и письмо, тогда как с в журнале записи есть три примитивных операции: чтение, письменной форме и контрольной точке.

По умолчанию SQLite выполняет контрольную точку автоматически, когда файл WAL достигает порогового размера 1000 страниц. (The Параметр компиляции SQLITE_DEFAULT_WAL_AUTOCHECKPOINT может использоваться для укажите другое значение по умолчанию.) Приложения, использующие WAL, не должны выполнять все для того, чтобы эти контрольно-пропускные пункты произошли. Но если они хотят приложения могут регулировать порог автоматической контрольной точки. Или они могут отключать автоматические контрольные точки и выполнять контрольно-пропускные пункты во время холостых моментов или в отдельном потоке или процессе.


Я хотел бы удалить файл базы данных из Android file system программы? Можно ли запустить сценарий оболочки, adb который, в свою очередь, запускает сценарий оболочки в пространстве Android для удаления базы данных? Могу ли я сделать это из JUnit теста (с помощью system() звонка)?

Как удалить всю базу данных в Android? Мне нужно, чтобы все прошло, чтобы я мог проверить создание базы данных. Я могу отбросить таблицы, но этого недостаточно. Это в эмуляторе, а не на телефоне.

Когда у вас есть свой Контекст и вы знаете имя базы данных, используйте:

Когда эта строка запускается, база данных должна быть удалена.

Убедитесь, что вы закрыли все подключения базы данных перед удалением. В противном случае вам придется перезапустить приложение.

Это просто, просто наберите из вашей оболочки:

@PeteH В эмуляторе вам не нужно разрешение, но для реального устройства вам понадобится рут Для меня это не потребовало какой-либо специальной настройки. Я имею в виду, конечно, я автоматически вошел в систему как root, но все

Статический метод SQLiteDatabase.deleteDatabase (File file) был добавлен в API 16. Если вы хотите писать приложения, поддерживающие более старые устройства, как вы это делаете?

Я пытался: file.delete ();

но это портит SQLiteOpenHelper.

НЕВАЖНО! Позже я понял, что вы используете Context .deleteDatabase (). Context один прекрасно работает и удаляет журнал тоже. Работает для меня.

Кроме того, я обнаружил, что мне нужно вызвать SQLiteOpenHelp.close () перед выполнением удаления, чтобы затем я мог использовать LoaderManager для его воссоздания.

Также из Eclipse вы можете использовать DDMS, что делает его действительно простым.

Просто убедитесь, что ваш эмулятор работает, а затем переключитесь на перспективу DDMS в Eclipse. У вас будет полный доступ к File Explorer, который позволит вам войти и легко удалить всю базу данных.

Работает ли это с реальным устройством телефона? Я не мог видеть никаких подпапок в папке данных при просмотре в режиме DDMS. Но этот вопрос касается удаления базы данных программно?

Это может кому-то помочь. Вы должны упомянуть расширение, иначе оно не будет работать.

context.deleteDatabase (DATABASE_NAME); удалит базу данных, только если все соединения закрыты. Если вы поддерживаете одноэлементный экземпляр для обработки вашего помощника по базе данных - легко закрыть открытое соединение.

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

Удалить старую базу данных при удалении приложения.

Установка android: allowBackup = "false" в теге приложения в AndroidManifest.xml устранила проблему. Кажется, по какой-то странной причине ОС Android восстанавливала из резервной копии каждый раз, когда я развертывал приложение.

Вы можете создать файл объекта текущего пути к базе данных, а затем удалить его, как мы удаляем файл из папки

Я использовал метод удаления базы данных Android и база данных успешно удалена

Я использовал следующее для «форматирования» базы данных на устройстве после того, как изменил структуру базы данных в активах. Я просто раскомментирую строку в MainActivity, когда хочу, чтобы база данных снова читалась из ресурсов. Это сбросит значения и структуру базы данных устройства в соответствии с занятой базой данных в папке активов.

Далее я реализую кнопку, которая будет запускать deleteDatabase, чтобы пользователь мог сбросить свой прогресс в игре.

Из диспетчера приложений вы можете удалить все приложение с данными. Или просто данные сами по себе. Это включает в себя базу данных.

Перейдите в Настройки. Вы можете войти в меню настроек либо в меню приложений, либо, на большинстве телефонов, потянув вниз панель уведомлений и нажав там кнопку.

Выберите подменю Apps. На некоторых телефонах это меню будет иметь немного другое имя, например, Диспетчер приложений.

Проведите вправо до списка Все приложения. Игнорируйте списки запущенных и загруженных приложений. Вы хотите список всех приложений.

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

Тема 16: Администрирование и управление базами данных в библиотеки SQLite

Администрирование и управление базами данных в библиотеки SQLite

Администрирование и управление базами данных в библиотеки SQLite

Итак, в этой записи мы поговорим о том, как мы можем управлять пользователями в базах данных SQLite. Затем разберемся с процессом создания баз данных в SQLite (в SQLite нет команды CREATE DATABASE, опять же, это потому, что SQLite является встраиваемой СУБД), поговорим о том, как подключать и отключать базы данных в рамках одного соединения (для этого есть специальные команды ATTACH DATABASE и DETACH DATABASE). Также мы рассмотрим SQL команду VACUUM, которая позволяет заново собрать базу данных (если можно так сказать, сделать дефрагментацию файла базы данных). А в завершении статьи мы поговорим про импорт базы данных в SQLite, возможности резервного копирования баз данных и о том, как удалить базу данных (команды DROP DATABASE в SQLite нет).

Управление пользователя в SQLite3 и их правами доступа

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

Итак, в SQLite нет возможности администрировать и управлять пользователями базы данных за исключением среды, в которой библиотека SQLite3 работает. Но мы можем, например, создавать VIEW в базе данных и не создавать для VIEW различные триггеры, которые позволяют манипулировать данными в базе данных.

При этом мы можем написать программный код так, чтобы он работал только с представлениями (если у представлений нет INSTEAD OF триггеров, то для него доступна только команда SELECT), таким образом мы ограничим количество команд доступных пользователям.

Создание базы данных в SQLite

Здесь мы опишем три способа создания базы данных в SQLite. Отметим, что в SQLite3 нет команды CREATE DATABASE. Команда CREATE в SQLite создает любые объекты базы данных, но не саму базу данных. Итак, мы помним, что при запуске шелла sqlite3.exe мы можем передать в качестве параметра имя базы данных. Поэтому первый способ создания базы данных SQLite заключает в том, чтобы передать параметр команде, позволяющей запустить шелл:

Создание базы данных в SQLite

Создание базы данных в SQLite

В данном случае мы создали базу данных с именем mydb и расширением sqlite3. В этом мы можем легко убедиться, воспользовавшись dot-командой .database:

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

Второй способ создание базы данных в SQLite

Второй способ создание базы данных в SQLite

Мы создали файл mydatabase.db3 и сохранили его в папку: c:\sqlite. Этот файл еще не является файлом базы данных SQLite3, так как у него нет служебных заголовков. Давайте это исправим, запустим sqlite3 без параметров и откроем созданный файл при помощи терминала:

Use ".open FILENAME" to reopen on a persistent database .

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

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

Если вы откроете рабочую папку, то увидите, что в ней появится новый файл, в нашем случае файл будет называться testsavedb, а его расширение будет .sample. Запомните, в SQLIte3 нет команды CREATE DATABASE, базы данных здесь не создаются средствами языка запросов SQL. В SQLite их можно создавать только при помощи административных возможностей библиотеки.

Управление базами данных в SQLite3

В SQLite есть возможности по управлению базами данных посредствам языка запросов SQL. Давайте посмотрим на возможности управления базами данных в SQLite3

Подключение базы данных: реализация SQL команды ATTACH DATABASE

Итак, первое, о чем стоит сказать, так это о том, что в SQLite есть специальная SQL команда ATTACH DATABASE, которая позволяет работать с несколькими базами данных в одном соединение. Давайте рассмотрим эту возможность администрирования баз данных. У нас есть три недавно созданных файла баз данных: testsavedb.sample, mydatabase.db3 и mydb.sqlite3. В данный момент мы работаем с файлом testsavedb.sample. Давайте воспользуемся SQL командой ATTACH DATABASE, чтобы подключить две оставшиеся базы данных:

Вторая команда выполнена не будет, так как мы не задали псевдоним для подключаемой базы данных, давайте это исправим:

А теперь выполним команду .database, чтобы убедиться в том, что базы данных были действительно подключены к данному сеансу:

Мы видим, что у подключенных баз данных есть псевдонимы, а также указан путь к файлу базы данных SQLite3. Теперь, если мы захотим поработать с той или иной базой данных, то нам следует использовать квалификатор или полное имя объекта базы данных, например, давайте создадим таблицу в базе данных first.db1:

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

Вторая команда CREATE выполнена не будет, так как если мы не указываем имя базы данных, то SQLite по умолчанию работает с главной базой данных main. Квалификатор это: database_name.table_name. Но обратите внимание, если во всех трех базах данных у нас будет таблица с уникальным именем, то к ней мы сможем обращаться без использования квалификатора, SQLite нас поймет.

Отключение базы данных: реализация SQL команды DETACH DATABASE

Так же мы можем отключать базы данных от текущего соединения при помощи SQL команды DETACH DATABASE. Команде DETACH DATABASE мы должны передать псевдоним, который мы использовали в команду ATTACH. Давайте отключим все подключенные ранее базы данных:

SQLite отключит все базы данных, кроме main. Main является основной базой данных в SQLite и ее мы никогда отключить не сможем, даже если мы явно не указали файл базы данных, с которым будем работать.

Стоит вспомнить о том, что все команды манипуляции данными (за исключением команды SELECT) и все команды определения данных работают в SQLite как транзакции, поэтому стоит отметить, что свойство атомарности при работе с несколькими базами данных в одном соединение сохраняется.

Повторная сборка базы данных: реализация SQL команды VACUUM. Дефрагментация базы данных в SQLite

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

Все мы знаем, что дефрагментация диска – это процесс оптимизации его логической структуры с целью увеличения скорости доступа к объектам файловой системы (папкам и файлам). Примерно тоже самое делает команда VACUUM с базами данных SQLite3. Допустим, у нас есть файл базы данных, с которым мы постоянно работаем: удаляем строки, модифицируем значения в таблица, добавляем новые строки в таблицу. При этом стоит помнить, что любая СУБД – это в первую очередь абстракция над физическими данными, которая позволяет нам с ними работать, как с таблицами.

Поскольку это абстракция, то мы не знаем, как данные хранятся на диске. Обычно, если база данных довольно старая, то одна строка может храниться одной части файла, а соседняя строка в другой. Из-за этого уменьшается скорость работы с базами данных, поскольку данные, хранящиеся в базе данных записаны в файл не последовательно, а разбросаны по его разным частям.

Стоит обратить внимание на то, что команда VACUUM может нарушить внутренние индексы таблицы в SQLite, если в таблице нет ограничения первичного ключа PRIMARY KEY. Причем ключевой атрибут таблицы должен быть объявлен, как INTEGER PRIMARY KEY (в этом случае он совпадает со столбцом ROWID).

Читайте также: