SqliteDog — современный менеджер баз данных SQLite. Как и когда использовать Sqlite

Понадобилось мне на днях найти какой-нибудь небольшой, но функциональный менеджер баз данных SQLite под Windows. Предложений в Сети оказалась масса, начиная от простеньких бесплатных программок-браузеров БД и, заканчивая, навороченными утилитами с массой как необходимых, так и бесполезных наворотов. В итоге образовался этот обзор. Свой конечный выбор я делал, исходя из следующих требований к программе:

  1. Функциональность. Возможность создавать таблицы, триггеры, индексы и т.д.
  2. Корректная работа с кодировкой UTF-8
  3. Цена. Желательно, конечно, чтоб цена была рана нулю, но в пределах разумного можно и немного раскошелиться.
  4. Наличие русского интерфейса. Не принципиально, но всё-таки удобнее работать с программой на родном языке.
  5. Удобство. Не хотелось бы долго и упорно ковыряться в интерфейсе в поисках необходимых функций.

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

SQLite Database Browser

Цена: бесплатно

Простой в использовании браузер баз данных SQLite. Так как основное назначение программы - просмотр данных, то, соответственно, функциональность ограничена.

Используя “SQLite Database Browser” можно:

  1. просмотреть структуру базы данных
  2. создавать новые таблицы с использованием мастера
  3. создавать индексы
  4. просматривать данные в таблицах и выполнять элементарный SQL-запросы (программа виснет наглухо при выполнении запросов типа “CREATE TRIGGER….”).

SQLite Database Browser понимает UTF-8 и, при необходимости, позволяет сменить кодировку. Русский интерфейс отсутствует.

SQLite3 manager LITE

Сайт производителя: http://www.pool-magic.net/sqlite-manager.htm

Цена: версия Lite распространяется бесплатно .

По сравнению с предыдущей программой “SQLite3 manager LITE” выглядит более функциональным. Кроме того, что можно просто просматривать данные в таблицах, также можно просматривать и создавать триггеры, индексы, представления и т.д. Дополнительно можно экспортировать все мета-данные базы данных. При этом можно создавать файлы с данными для экспорта таблиц в Paradox и Interbase.

Также в программе была предпринята попытка зделать, что-то вроде визуального мастера создания запросов наподобие MS Access, но, на мой взгляд, попытка успехом не увенчалась.

У бесплатной версии есть один недостаток - не понимает данные в кодировке UTF-8. Есть, конечно, возможность указать кодировку базы данных при открытии файла, но в списке кодировок UTF-8 отсутствует. Как работает Full-версия программы я так и не увидел, т.к. на сайте производителя чёрт ногу сломит. Висит какой-то непонятный javascript , выводящий непонятную инфу. В общем, сложилось впечатление, что проект успешно заглох.

SQLite Administrator

Цена: бесплатно

Достаточно удобная в использовании и функциональная программа. Вся структура базы данных представлена в виде дерева объектов, которое можно настраивать в зависимости от своих предпочтений. Судя по всему SQLite Administrator написан с использованием , т.к. среди дополнительных функций программы есть генерация кода Delphi по выделенному фрагменту SQL. Для создания таблиц, триггеров и т.д. используются удобные мастера. При использовании этой программы очень сильно огорчило отсутствие возможности нормальной работы с UTF-8 и, незначительно, но всё же несколько подпортил впечатление русский интерфейс - некоторые надписи не помещаются в отведенное им место. ак что при тестировании использовал дефолтный English.

Если для вас не принципиально использование UTF-8, то качайте SQLite Administrator - не пожалеете.

SQLiteManager

Цена: 49$ Есть Demo-версия

SQLiteManager как и предыдущая программа имеет достаточно удобный интерфейс, прекрасно понимает UTF-8 и наряду с этим имеет ряд своих “фишек”. Среди которых:

  1. Анализатор SQL-запросов
  2. Проверка целостности базы данных
  3. Оптимизация базы данных
  4. Возможность использования в программе своих скриптов (по-моему VBScript) для повышения удобства работы.

К дополнительным функциям программы можно отнести возможность генерации отчётов по базе данных. Demo-версия имеет свои жёсткие ограничения по запросам, например, в результаты SELECT попадают только первые 20 записей из набора. В плане удобства работы подпортило впечатление уж очень сильно мельтешение при перерисовки окон. У меня не такой уж и древний комп, но даже при 512 Mb видюшки окна заметно моргали.

SQLite Maestro

Цена: от 79$ есть Trial-версия на 30 дней .

Вообще линейка продуктов от SQL Maestro насчитывает огромное количество продуктов для администрирования самых разнообразных баз данных, в том числе и SQLite. Первое впечатление от программы - добротно сделанная игрушка для созерцания её со стороны. Да SQLite Maestro имеет всю ту функциональность, что мне была необходима, удобное дерево объектов баз данных, возможность достаточно быстро создавать различные объекты БД и т.д., но после достаточно лёгкого в использовании SQLite Administrator вид многоуровневых замороченных меню с кучей различных опций, которые по-большому счёту-то в принципе не нужны, как-то становится жутковато работать с этой программой. По этой причине и была выставлена 1 за удобство. Цена тоже не особо порадовала - 79$. По мне так лучше бы упростили интерфейс и снизили ценник хотя б до 50$ тогда можно было бы и подумать о покупке.

SQLite Expert

Цена: версия Personal - бесплатно, версия Professional - от 38$

В целом, для себя я не слишком уж больших отличий версии Personal от Professional . Чтобы разобраться с работой SQLite Expert потребовалось не более пяти минут. Программа имеет весь тот набор функций, которые были мне необходимы. Как и SQLiteManager Expert умеет проверять целостность базы данных, экспортировать данные в CSV или другие форматы баз данных, имеет удобный редактор SQL, мастеров для создания таблиц, индексов, триггеров и т.д. Доступ к функциям программы несколько сложнее, чем у SQLite Administrator , но не настолько, чтобы отпугивать только своим видо:). В общем, я остановил свой выбор на SQLite Expert Personal .

Именно эта программа на данном этапе моей работы с SQLite показала наилучшие результаты как по качеству и удобству работы, так и по набору всех необходимых функций. Жаль, конечно, что бесплатный Administrator не знает, что такое UTF-8 - может в новой версии подпраят, тогда, возможно я и пересмотрю свой выбор.

Книжная полка

Название :Базы данных и Delphi. Теория и практика

Описание Книга основана на материалах лекций и практических занятий, разработанных автором, и объединяет теоретические основы и практические аспекты разработки реляционных баз данных.

Купить на ЛитРес 383 руб.
Автор : Анатолий Хомоненко, Владимир Гофман
Название :Работа с базами данных в Delphi
Описание : Рассматривается использование средств Delphi для разработки приложений баз данных. Даются понятия баз данных, характеризуются элементы и описываются этапы проектирования реляционных баз данных, изложена технология разработки информационных систем, освещаются приемы работы с данными, создание таблиц и приложений баз данных, подготовка отчетов.
Купить на ЛитРес 151 руб.

Наверное, каждый разработчик сталкивался с базами SQLite хотя бы раз за свою карьеру. А если он занят мобильными приложениями, то, видимо, просто не имеет шанса их избежать. Мы тоже не стали исключением и в своих проектах часто используем эту замечательную БД. Как известно, создателями SQLite для администрирования официально предоставляется лишь консоль. Это породило целый сонм чудовищ громадье различных менеджеров от сторонних компаний.

Увы, количество не перешло в качество. У всех приложений мы нашли те или иные проблемы. Некоторые слегка шокируют. Например, очень популярным менеджером является бесплатный add-on браузера Firefox с незатейливым названием SQLite Manager. 234 записи в его issue tracker (как это будет по-русски?) пошатнут веру в будущее даже у бывалого айтишника. «Неверное отображение 8-байтных чисел». Да, совершенно верно, этот менеджер не может правильно показать все цифры в представлении 8-байтного целого (видимо из-за своей javascript натуры). Подумаешь, кого волнуют большие числа?

Многие менеджеры являются универсальными (поддерживают все популярные БД) и просто не дают использовать все особенности SQLite (которых весьма много). Еще одна проблема: перегруженный интерфейс. Часто возникало ощущение, что разработчики просто «вывалили» весь функционал приложения на главный экран в виде кучи мелких кнопочек. Также раздражало разбиение возможностей по нескольким приложениям: редактор данных, редактор схемы, импортер данных и пр. Маркетинг - это хорошо, но неудобно пользоваться. Наконец, модное нынче поветрие - выпускать приложение сразу на нескольких платформах с единой кодовой базой и фреймворком - часто приводит к появлению кучи мелких багов в интерфейсе: проблемы со шрифтами, неверная кодировка, неправильная высота строк, «уезжание» контролов и пр.

Наши сомнения подкрепил один пост на stackoverflow.com, в котором делался вывод, что «несмотря на большое число менеджеров баз SQLite, действительно удобного не существует и это играет отрицательную роль в плане популяризации SQLite». Так этот проект и появился на свет.

Разрешите представить: SqliteDog - современный менеджер баз данных SQLite. Нам хотелось немного изменить привычный интерфейс редактора БД, чтобы он больше походил на «помесь Excel с Chrome», чем на «SQL Server Management Studio». Мы исходили из следующей мантры: менеджер БД стоит на «трех китах». Это сами данные, схема данных и SQL запросы. Следует сделать выборку данных максимально простой и удобной, следует отображать данные максимально полезно (см. ниже). Следует показать схему данных наглядно и позволить ее произвольно менять. Редактор SQL должен быть красивым, удобным; работа с SQL не должна создавать проблем. Также хотелось иметь наглядный и удобный механизм управления настройками (PRAGMA) SQLite, которых много и которые на очень многое влияют. Например, по умолчанию ограничения внешних ключей отключены и размер кэша составляет 2000 страниц базы. В 95% случаев это не лучшие настройки, но они обычно «спрятаны» внутри каких-то подменю.

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

Дерево объектов БД
Это такой пыточный контрол, который обычно находится слева и содержит в себе связанные в деревья соединения к БД и объекты БД. Чтобы добраться до, например, столбцов таблицы обычно нужно:
- развернуть список БД и найти нужную;
- развернуть ветку «Таблицы»;
- найти нужную таблицу;
- развернуть ветку «Столбцы».
Причем сама операция «разворачивания» означает:
- попадание мышкой в малюсенький крестик, который каждый раз меняет свое положение;
- появление нового списка, который нужно осмотреть и который сдвигает уже имеющееся представление дерева.
Если подумать, то дерево - это, наверное, самый неудобный контрол из возможных; его используют из-за гибкости (любую иерархию можно засунуть). Однако, сценарий работы с БД, как правило, более сложный, чем просто «посмотреть столбцы». Допустим, пользователь хочет понять - нет ли у столбца какого-то ограничения. Как в этом случае нам поможет список столбцов? Никак, потому что ограничение на столбец может быть задано на уровне таблицы. А если пользователь ищет какой-то конкретный столбец в нескольких таблицах? Ему намного удобнее открыть схему БД, где на одном экране будет сразу все необходимое (чем разворачивать каждую таблицу). И т.д.
Кроме того, нам не нравилась (привычная) практика работы с несколькими базами данных в одном экземпляре приложения. Нам показалось, что это источник путаницы и усложнения: все время нужно понимать в какой базе ты проводишь то или иное действие. Мы решили, что один экземпляр приложение работает ровно с одной БД (одно соединение) и отказались от дерева в пользу линейного списка таблиц и представлений. Можно быстро переключиться на любую базу из истории. В итоге, чтобы посмотреть и отредактировать схему таблицы в SqliteDog нужно сделать всего два клика. При этом элементы списка объектов БД, разумеется, не сдвигаются, а остаются на своих местах.
Сохранение SQL запросов
Как это часто бывает, одно решение повлекло за собой другое. Как только мы решили, что хотим быстро переключаться между базами, сбрасывая все текущее состояние, возникла проблема потери введенных SQL запросов. Хранить SQL запросы в файлах? Но зачем? Опять - архаизм. У нас «под рукой» мощнейшая СУБД. Размеры запросов, как правило, невелики. Вести их историю не составит никаких проблем. Итак, все запросы автоматом сохраняем в специальной БД. Ушло это назойливое окно «Вы сделали изменения, хотите сохранить?», какое облегчение. Но что-то и потерялось. Имена файлов несут какую-то информацию, привязку, а теперь их нет вовсе. Решили эту проблему, сделав поиск в истории по ключевым словам запроса.
Просмотр выбранных данных в таблице
Все менеджеры БД позволяют вывести в таблицу запрошенные данные (этого у них не отнять). Как они это делают? Например, ширина столбцов. Обычно вместо подгонки под содержимое используется просто равномерное деление всей ширины на количество столбцов. Это крайне нерационально использует экранное пространство. Или взять представление данных. Отчего сразу не показать цветом какого типа значение: строка или число? Отчего число сразу не отбить вправо? Пустая ячейка - это NULL или пустая строка? Чтобы это узнать, нужно еще кликать по ячейке и смотреть какие-то свойства, почему? Если в ячейке находится BLOB (двоичные данные) - зачем мне видеть его шестнадцатеричное представление? Какой резон? Заметим, что все менеджеры гордо хвастаются показом картинок в BLOB-ах. Спасибо, конечно, но строки и числа все-таки используются чаще. Встречается еще и такой (довольно странный) прием. Если значение столбца представляет из себя строку с переводами кареток, то высота строки таблицы увеличивается пропорционально количеству строк. То бишь, допустим, у вас в столбце хранятся небольшие XML тексты. При просмотре на один экран теперь влезают максимум 3 записи.
В SqliteDog мы постарались «выжать максимум» полезного при отображении данных. Сразу, без дополнительных настроек. Числовые значения подсвечены цветом и отбиты вправо. Значение NULL отображается особо и легко отличимо от пустой строки. Для BLOB показан размер. Если в строке-значении есть управляющие символы ("\r\n"), они подсвечены другим цветом, высота строки таблицы не увеличивается. Картинки, разумеется, тоже отображаются. И одним кликом можно посмотреть картинку на весь экран. По клику (или нажатию F4) ширина столбцов видимых строк равномерно подгоняется под их содержимое. Двойной клик на ячейке подгоняет ширину конкретного столбца. Скроллить по таблице можно и мышкой, и клавиатурой. Причем прокрутка колеса мыши при зажатой клавишей Control позволяет прокручивать таблицу влево-вправо. Все эти мелочи облегчают жизнь.
Что такое «ничего»?
Традиционно, многие приложения имеют состояние «нет документа». Например, при старте. А нужно ли это пользователю? Предположим пользователь SqliteDog закрывает соединение к базе. Что это значит? Он хочет открыть другую БД? Но зачем закрывать текущую - просто открой другую. Он хочет завершить работу? Но тогда нужно просто закрыть приложение. Решение было найдено такое: соединение к БД в SqliteDog есть всегда . Если пользователь закрыл БД, то SqliteDog создает пустую БД «в памяти» (одна из полезнейших возможностей SQLite). То же и при запуске приложения. Как только эта фича появилась, тут же возник дополнительный сценарий использования. Иногда нужно быстро вспомнить название функции SQLite. Запускаем SqliteDog, сразу доступно окно ввода SQL. Начинаем набирать название - выпадает список автодополнения. Находим нужную функцию, копируем, готово.
Компромиссисы Компромиссы
По мере разработки становилось ясно, что, потенциально, количество функционала - безгранично. Такова природа проекта. Всегда можно найти еще одну «хотелку». И решить, что без нее - ну, никак. Поэтому было принято «бритвенное» решение: часть «больших» фич уходит во «вторую версию». Решение по фичам принималось коллективно. Таким образом, ведется список активных задач с приоритетами и список фич «второй версии». Видеть их вместе удобно, чтобы снова и снова не придумывать одно и то же. Бывало так, что заготовки для одной возможности позволяли легко реализовать другую и тогда фича «возвращалась» из второй версии в первую. Также из забавных моментов: некоторые фичи так долго откладывались, заменяясь более срочными, что в итоге в SqliteDog нельзя перетаскивать вкладки мышкой. Это будет исправлено во «второй версии» (наверное:). Еще один компромисс - это выбор одной платформы (Windows). Увы, мы не смогли найти приемлимого для нас фреймворка, который обеспечил бы кроссплатформенность без потери качества и скорости. Делать свой, то есть изобретать велосипед - это все-таки перебор, цель изначально стояла иная. В итоге проект был «заточен» под Windows (и отнял примерно год). Но мы получили отзывчивость и качество отображения на требуемом уровне.
Лицензия
Засим остановимся (но, если хабрасообщество заинтересовано в продолжении «саги», то оно последует). Что касается лицензии на продукт. Мы решили, что помимо коммерческой будет доступна официальная бесплатная версия SqliteDog. Без лимитов по времени, количеству строк, количеству таблиц, размеру БД и пр. В бесплатной версии после 30 дней использования становятся недоступны только дизайнеры (базы, таблицы и индекса) и некоторый импорт/экспорт данных. Интерфейс SqliteDog полностью русифицирован (разумеется, есть и английская трансляция для любителей). Русскоязычная версия сайта также сушествует.
Заключение или TL;DR
SqliteDog - это менеджер БД SQLite для эффективной работы. Его создатели решили отказаться от привычных интерфейсных решений и максимально упростить и облегчить взаимодействие. Поэтому одно приложение = одна база (точнее, одно соединение, можно сделать ATTACH других баз). Данные выборок отображаются максимально информативно, просматривать/сортировать и даже редактировать записи можно в процессе выполнения запроса (остановить загрузку можно в любой момент, нажав Esc). Некоторые возможности SqliteDog являются уникальными. Например, управление транзакцией через кнопки на панели соединения. Или режим мониторинга таблицы, при котором новые записи автоматически подгружаются («Выбрать последние 1000», нажать кнопку со стрелкой в кружке). Или возможность открыть схему базы и зафиксировать ее в отдельном окне на втором мониторе (чтобы всегда иметь перед глазами). Или возможность одним нажатием перевести переводы кареток в значении столбца из UNIX в Windows формат.

Мы будем рады услышать отзывы и пожелания по доработке. Спасибо за интерес.

Теги: Добавить метки

SQLite - очень популярное решение хранения данных, и операционная система Android не исключение. Сама система и многие программы используют для хранения информации базы данных — файлы с расширением db. Какие именно данные содержатся в базах, как их посмотреть, что с ними можно сделать и чем это грозит устройству с правами суперпользователя - обо всем этом я расскажу в статье.

WARNING

Автор статьи не является знатоком баз данных, равно как и SQLite, понимает, что некоторые действия можно совершать проще, а также не несет ответственности за возникновение паранойи после прочтения данной статьи. Также настоятельно рекомендуется перед любыми манипуляциями сделать бэкап редактируемой базы.

Работа с базами

Для работы с базами существует немало различного софта как для компа, так и для Android-устройств. Базы приложений обычно находятся по пути /data/data/НАЗВАНИЕПАКЕТА ПРИЛОЖЕНИЯ/databases. Узнать название пакета интересующего приложения можно зайдя в «Настройки -> Приложения -> Все» и выбрав нужное (откроется вкладка «О приложении»), или в адресной строке браузера на странице приложения в Play Market.

Чтобы попасть в сам каталог /data/data, необходимы права суперпользователя, а с просмотром содержимого отлично справится Root Explorer. Для более удобной работы, а также для редактирования баз на устройстве можно использовать, например, SQLite Debugger , а на компе - DB Browser for SQLite . Для работы с базами также необходим установленный BusyBox с апплетом sqlite3. Все манипуляции в статье проводятся на Nexus 5 с прошивкой 5.1. Доступные для просмотра и редактирования базы, разбитые по соответствующим программам, на устройстве можно посмотреть в той же программе SQLite Debugger, нажав на главном экране меню App. Так чем же могут быть полезны базы в первую очередь тебе и что может украсть злоумышленник? Попробуем разобраться.

INFO

Огромная благодарность demosfenus за помощь в написании SQL-запросов.

accounts.db

Находится в /data/system/ или /data/system/users/0 в зависимости от версии прошивки и содержит данные обо всех аккаунтах, зарегистрированных на устройстве. Как видно на скриншоте «Структура accounts.db» в таблице accounts, к моему устройству привязано пятнадцать аккаунтов различных программ. Почти для всех указаны логины, для части есть пароли (на рисунке часть удалена) в зашифрованном виде.


В таблице authtokens содержатся токены авторизации от приложений, всех сервисов Google, GMS и других приложений. На вкладке extras - дополнительные ключи и значения, такие как GoogleUserId и список подключенных приложений/сервисов. У меня их около пятидесяти, включая Talk, YouTube, URL shortener, Wallet и другие.


Не скажу, может ли злоумышленник расшифровать пароли из базы, но получить доступ к сервисам можно, просто подкинув базу на другое устройство. Попробуем провести такой эксперимент. Возьмем базу со смартфона Nexus 5 и планшет Nexus 7 с чистой системой (свежеустановленная 5.1 через flash-all.bat с ключом -w, затем root). После загрузки чистой системы нажимаем «Пропустить» при запросе добавления аккаунта, далее устанавливаем весь софт, прописанный в accounts.db (WhatsApp официально не поддерживает работу на планшетах, поэтому качаем APK с варезников или 1mobile.com). Далее скидываем базу со смартфона, помещаем в каталог /data/system/users/0 на планшете и перезагружаемся.

После загрузки видим, что на вкладке «Настройки -> Аккаунты» появился наш аккаунт Google и дал нам полный доступ ко всем связанным программам. Почта, с помощью которой можно поменять пароль от аккаунта, все контакты с номерами телефонов, Google+, фотографии, файлы Google Drive, заметки, сохраненные авторизации в мобильном Хроме и так далее. Единственный неприятный момент - нерабочий Play Market, который выдает: «Ошибка при получении данных с сервера rpc:s-7:aec-7». Погуглив текст ошибки, можно легко его реанимировать.

Остальные приложения вели себя по-разному:

Вывод: к последним трем программам легко получить доступ, если увести данные из accounts.db или саму базу.

mmssms.db

А вот и вся наша СМС-переписка. Находится она по пути /data/data/com.android.providers.telephony/databases/. Попробуем что-либо поменять. Для примера возьмем СМС с номера 900 - это информатор Сбербанка. На скриншоте «СМС от Сбербанка до и после вмешательства в mmssms.db» слева, последнее сообщение: «ECMC6844 02.05.15 12:49 покупка 450р 210009 KARI Баланс: 3281.16р». Поменяем его на более интересное сообщение, показанное справа. Для этого открываем базу на устройстве в SQLite Debugger. Нас интересует таблица sms. Выделим необходимые поля запросом:

> SELECT _id, thread_id, address, date, body FROM sms WHERE address = 900

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


Итак, нажав на SELECT и отметив галочками нужные поля, получим таблицу, содержащую номер записи, номер ветки разговора, номер отправителя, дату в UNIX time и собственно текст СМС (см. скриншот «Изменяем значения в базе mmssms.db»). Долгий тап на последней записи. Программа предлагает на выбор действия. Выбираем Update value. Вводим необходимый нам текст. По аналогии с предыдущими СМС сделаем себе зачисление денег через банкомат. Изменим текст на «ECMC6844 05.05.15 10:18 зачисление 1000000р ATM 367700 Баланс: 1003731.16р». Сам запрос будет выглядеть так:

> UPDATE sms SET body = "ECMC6844 05.05.15 10:18 зачисление 1000000р ATM 367700 Баланс: 1003731.16р" WHERE _id = 196

Нажав на треугольник в правом верхнем углу, внесем изменение в строку. Подгоним время из текста СМС (05.05.15 10:18) в поле date. Можно использовать любой UNIX time конвертер, например Онлайн калькулятор unix time stamp . Соответствующая дата будет 1430810300. Добавим в конец три произвольных цифры для миллисекунд и вставим полученное значение в поле date.

> UPDATE sms SET date = 1430810300000 WHERE _id = 196

Две команды можно объединить в одну, вписав редактируемые поля с данными через запятую. Нажимаем в правом нижнем углу кнопку Commit и вносим изменения в базу. Смотрим, что получилось. На том же скриншоте «СМС от Сбербанка до и после вмешательства в mmssms.db» справа видно, что теперь мы богатые люди и на счету у нас больше миллиона. Иногда требуется очистить данные приложения, обрабатывающего СМС, чтобы изменения вступили в силу.


Попробуем добавить в базу новую СМС. Для этого нам понадобятся две таблицы в базе: threads, которая хранит порядковый номер и заголовок (последнее сообщение) разговора/нити, и sms, которая хранит всю оставшуюся информацию. Вариантов событий тут два.

Вариант 1: добавляем СМС в существующий разговор. Для этого ищем в таблице sms номер ветки разговора - thread_id, соответствующий номеру отправителя. Как видно на скриншоте «Изменяем значения в базе mmssms.db», для информатора Сбербанка это цифра 7. Добавим новую строку в разговор, показанный на предыдущем скриншоте. Заполняем следующие поля: thread_id - ветка/нить разговора; address - номер отправителя; person - если отправитель есть в списке контактов; date - время прихода СМС; read - 1 для прочитанного сообщения, 0 для непрочитанного; type - 1 входящее, 2 исходящее (есть еще 0 - отправляемое и 4 - черновик); body - текст сообщения. Для добавления новой строки в таблицу необходимо выполнить следующую команду:

INSERT INTO sms (threadid, address, date, read, type, body) VALUES (7, 900, strftime("%s", "now")*1000, 1, 1, "Текст сообщения")

Значение strftime("%s", "now")*1000 используется для вставки текущего времени. Для вставки конкретной даты и времени необходимо использовать UNIX time с тринадцатью цифрами. Результат можно увидеть на скриншоте «Добавляем новую СМС в существующий разговор».


Вариант 2: добавляем новую СМС и создаем новую ветку разговора. Если по аналогии добавить строку с новым номером +7123456789, которого нет в записной книге и с которым ранее не было переписки, то в отправителях будет значиться «Неизвестный отправитель» без указания номера (см. скриншот «Добавляем новую СМС и создаем новую ветку» слева). Чтобы этого избежать, необходимо увязать еще таблицы threads и canonical_addresses. Сначала добавляем строку с номером в canonical_addresses, попутно проверяя наличие этого номера в таблице:

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

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

SQLite - это база данных, чем-то похожая на MySQL. Принципиальное отличие SQLite от других БД в том, что вся база представляет собой один файл. Если в MySQL база хранится где-то в дебрях сервера и недоступна для переноса, то в SQLite с этим всё до безобразия просто: один файл - одна база.

Конечно же, сервер должен поддерживать драйвер SQLite (также как и любой другой БД), но как правило сейчас с этим проблем нет.

SQLite позволяет привычно работать с базой через SQL, создавать таблицы, поля и т.д. В целом можно сказать, что SQLite ни в чем не уступает привычной MySQL, за исключением, пожалуй более медленной работы с «тяжелыми» sql-запросами по обновлению данных (insert и update). Но, опять же, это для высоконагруженных сайтов.

Огромным плюсом SQLite будет её легкая переносимость. Скопировать файл - что может быть проще? Не нужно заботиться о бэкапах, как в MySQL, не нужно создавать на сервере пользователя с паролем, не нужно создавать саму базу. С SQLite просто берём и пользуемся.

Для работы с базой данных в PHP лучше использовать PDO - Объекты данных PHP - это т.н. абстракция, которая предлагает единый интерфейс для работы с разными базами. В теории, используя PDO, можно переключиться на любую базу, не переделывая SQL-запросы, например с MySQL на SQLite. Меняются только параметры подключения.

Таким образом SQLite будет подключаться через PDO. Для этого ничего не требуется, поскольку сам PDO уже в составе PHP, а драйвер SQLite, как правило, также включен на серверах.

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

Чтобы добавить это дополнение в основное меню FireFox («гамбургер»), нажмите Изменить и перетащите мышью икноку в меню.

На этом установлен и можно им пользоваться.

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

Этот файл можно перемещать (и переименовывать) куда угодно, а после открывать командой меню Базы данных - Подключить базу данных .

Теперь нужно создать таблицу (или таблицы) в базе данных.

SQLite Manager автоматом создаёт служебные таблицы sqlite_XXX . Мы их не трогаем и нам они не мешают.

Таблица в БД - это то место, где хранится структурированная информация. Таблица должна иметь набор полей с заданными свойствами. Например поле может быть integer - для целых чисел, или text - для текста. Количество полей может быть произвольным и определяется только задачей вебмастера.

Пусть, например, у нас будет таблица pages с полями

  • id - уникальный номер (автоинкремент)
  • slug - ссылка
  • text - произвольный текст
  • hits - число просмотров

После того, как таблица создана, обратите внимание на блок «SQL-оператор создавший этот объект». В нем будет SQL-запрос, которым можно создать таблицу. Он может пригодится, если требуется создать таблицу в базе через PHP.

На вкладке «Просмотр и Поиск» можно редактировать таблицу. Создадим для примера две строчки, где поле slug будет home и contact . Это будут две страницы: главная и сайт/contact .

Поле hits будет содержать счетчик просмотров страницы. Текст может быть любым.

Всё, база готова, теперь можно её использовать.

Поставим задачу. Пусть у нас будет простенький сайт, который будет выдавать по короткой ссылке (slug) соответствующий текст и количество просмотров.

Если мы делаем это на локальном сервере, то пусть сайт будет в каталоге sqlite . В нём подкаталог db , куда мы и скопируем наш pages.sqlite .

Роутинг мы можем сделать, как описано в предыдущей статье . Файл.htaccess

AddDefaultCharset UTF-8 Options -Indexes RewriteEngine on RewriteBase /sqlite/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) /sqlite/index.php?$1

В index.php сам роутинг будет описан одной строчкой:

$page = ($p = key($_GET)) ? $p: "home";

  • подключаем базу
  • делаем в ней выборку по $page
  • выводим полученные данные
Я намеренно упрощаю алгоритм, чтобы не усложнять php-код.

Существуют два варианта работы с БД. Первый - это нативный php-код. Он не очень сложный, но обилие параметров немного напрягает. Поэтому второй вариант - использование дополнительных библиотек-оберток. С ними код становится лаконичней.

Приведу код index.php в первом варианте:

setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $sql ="SELECT * FROM pages WHERE slug=:page LIMIT 1"; $sth = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); $sth->execute(array(":page" => $page)); $rows = $sth->fetchAll(); print_r($rows); // здесь выводим данные } catch(Exception $e) { echo $e->getMessage(); } # end of file

Для второго варианта я использовал php-библиотеку с сайта labaka.ru , которую разместил в подкаталог lib .

Код index.php:

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

Здесь следует отметить пару важных моментов.

В первую очередь, вся работа с PDO должна заключаться в блок try..catch . Таким способом отлавливаются сообщения об ошибках.

Данные, которые отправляются в sql-запрос должны проходить через валидацию. В PDO, когда используется предподготовка данных (PDO::prepare), выполняется принудительное экранирование параметров. Это позволяет защититься от возможных SQL-инъекций.

Когда происходит подключение базы данных SQLite, в случае отсутствия файла базы, он будет создан автоматически. На этом базируется создание базы сразу после его подключения и создание нужных таблиц первым sql-запросом (о котором я написал выше).

Еще одно замечание по SQLite. Поскольку база это файл, то его можно скачать по URL прямо через браузер. Поэтому каталог с SQLite-файлами лучше защищать через.htaccess строчкой Deny from all . Или же размещать выше чем основной www-каталог.

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

Вы можете к этой статье.