Базу данных телефонов для андроид

Правильная работа с БД в Android

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

Способы работы с БД

Существует три способа работы с данными в БД, которые сразу бросаются на ум:
1) Вы создаете пустую структуру базы данных. Пользователь работает с приложением(создает заметки, удаляет их) и база данных наполняется. Примером может служить приложение NotePad в демо-примерах developer.android.com или на вашем дроид-девайсе.
2) Вы уже имеете готовую БД, наполненную данными, которую нужно распространять с приложением, либо парсите данные из файла в assets.
3) Получать данные из сети, по мере необходимости.
Если есть какой-то еще один или два способа, то с радостью дополню данный список с вашей помощью.
Все основные туториалы расчитаны как раз на первый случай. Вы пишите запрос на создание структуры БД и выполняете этот запрос в методе onCreate() класса SQLiteOpenHelper, например так:

Примерно так. Более полный вариант класса и других составляющих можно посмотреть по ссылке внизу статьи.
Дополнительно можно переопределить методы onOpen(), getReadableDatabase()/getWritableDatаbase(), но обычно хватает того, что выше и методов выборки данных.
Далее, экземпляр этого класса создаем в нашем приложении при его запуске и выполняем запросы, то бишь проблемная часть пройдена. Почему она проблемная? Потому что, когда пользователь качает приложения с маркета, то не задумывается о вашей базе данных и может произойти что угодно. Скажем сеть пропала или процесс другой запустился, или вы написали уязвимый к ошибкам код.

Кстати, есть еще один момент, на который стоит обратить внимание. Переменную экземпляра нашего класса можно создать и хранить в объекте Application и обращаться по мере необходимости, но нужно не забывать вызывать метод close(), так как постоянный коннект к базе — это тяжелый ресурс. Кроме того могут быть коллизии при работе с базой из нескольких потоков.
Но есть и другой способ, например, создавать наш объект по мере необходимости обращения к БД. Думаю это вопрос предпочтения, но который также необходимо обсудить.

А теперь самое главное. Что, если нам понадобилось использовать уже сушествующую БД с данными в приложении?
Немного погуглив, Вы сразу наткнетесь на такую «замечательную статью» — www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications в которой, как покажется, есть нужная панацея. Но не тут то было. В ней еще и ошибок несколько.

Вот они:
1) В методе createDataBase() строка:
SQLiteDatabase dbRead = getReadableDatabase();
и далее код… содержит crash приложения на НТС Desire, потому что получаем БД для чтения(она создается), но не закрывается.
Добавляем строкой ниже dbRead.close() и фикс готов, но момент спорный.
Вот что говорит дока на тему метода getReadableDatabase():
Create and/or open a database. This will be the same object returned by getWritableDatabase() unless some problem, such as a full disk, requires the database to be opened read-only. In that case, a read-only database object will be returned. If the problem is fixed, a future call to getWritableDatabase() may succeed, in which case the read-only database object will be closed and the read/write object will be returned in the future.
Like getWritableDatabase(), this method may take a long time to return, so you should not call it from the application main thread, including from ContentProvider.onCreate().

И так. Данный метод не стоит вызывать в главном потоке приложения. В остальном все понятно.
2) Ошибка: No such table android_metadata. Автор поста выкрутился, создав данную таблицу заранее в БД. Не знаю на сколько это правильный способ, но данная таблица создается в каждой sqlite-бд системой и содержит текущую локаль.
3) Ошибка: Unable to open database file. Здесь много мнений, разных мнений, которые Вы можете прочесть по ссылкам ниже.

Читайте также:  Оболочки для андроид рейтинг

Возможно, что проблемы связаны с тем, что один поток блокирует БД и второй не может к ней обратиться, возможно проблема в правах доступа к приложению(было замечено, что чаще проблемы с БД проявляются на телефонах марки НТС именно на тех моделях, которые нельзя рутануть, хотя не только на них, например на планшетах Асер), но как бы то ни было проблемы эти есть.
Я склоняюсь к варианту, что проблема в потоках, не зря ведь нам не рекомендуют вызывать методы создания базы в главном потоке.

Возможно выходом из этого будет следующее решение(рассматривается вариант №2). Используя первый вариант работы с базой, наполнить ее данными после создания, например:

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

Вцелом, данный пост показывает(касательно способа №2) как делать не надо, но и также содержит пару любопытных мыслей.
Метод getReadableDatabase() можно переопределить например так:

Кстати: следуя практике самой платформы, поле первичного ключа стоит называть «_id».

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

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

Файлик data.txt лежит в assets такой:
Zametka #1
Zametka #2
Zametka #3
Zametka #4

И класс приложения:

Отмечу, что данный класс используется только для демонстрации и проверки того, что произойдет при вызове методов getReadableDatabase()/getWritableDatabase() и создании базы. В реальных проектах код нужно адаптировать.
Кроме того в базе появилась табличка android_metadata(без моего участия), поэтому указанная выше ошибка решена.
Надеюсь кому-то пригодится.

Любопытные дополнения №1(от хабраюзера Kalobok)

Источник

Превращение Android телефона в сетевую SQL базу данных (MyMobileSQLServer — Utesov)

Недавно я начал делать очередной проект для мобильных устройств. Его побочным продуктом стало приложение, с помощью которого можно развернуть сетевую базу данных на любимом Android телефоне, планшете и т.п… Предлагаемое решение является сетевым провайдером SQLite базы данных.

Приложение многопользовательское, каждый пользователь имеет свою БД, которая недоступна другим пользователям. Код открытый, лицензия Apache 2.0.

Для демонстрации заявленных возможностей написано простое приложение которое позволяет делать SQL запросы на сервер и получать результаты их выполнения, его код рассмотрим здесь. Время освоения — 10 минут. Для тестирования достаточно одного устройства (если используется два и более, то необходимо WiFi подключение). Поехали!


Кадр из к\ф «Весёлые ребята» (доработанный)

Прежде всего устанавливаем приложение (сервер) MyMobileSQLServer — Utesov из PlayMarket, Yandex.Store или из репозитория. Далее необходимо создать пользователя для доступа к данным и саму базу данных. Для этого на главном экране выберите «edit user» -> «Add user». Заполняйте поля формы. После возвращайтесь на главный экран приложения и запускайте его с помощью кнопки «on». Обратите внимание на порт и IP адрес для подключения.

Перейдем к непосредственному созданию приложения для доступа к сетевой БД.

1 — Создаем новый проект. Копируем файл библиотеки «myMobileSQLClient.jar» в директорию для хранения библиотек и делаем необходимые действия, чтобы она стала доступна для проекта

2 — Настраиваем манифест проекта, добавляем директиву для возможности использования подключения к сети:

3 — Кидаем на форму:
пять полей ввода: IP адрес, номер порта, текст для sql запроса, логин, пароль;
три кнопки: подключиться, отключиться, отправить запрос;
поле для вывода информации.
У вас должно получиться примерно так:

Копируем следующий код с необходимыми корректировками:

Теперь разберемся что происходит.
За работу с удаленной БД отвечает данный объект:
MainMobileSQLClient mainMobileSQLClient;
В нём переопределены следующие методы:
onMessage — пришло сообщение с сервера;
onConnection — клиент осуществляет подключение к серверу;
onConnect — клиент подсоединился к серверу;
onDisconnect — клиент отсоединился от сервера;
onErrAuthentication — ошибка аутентификации;
onCompleteAuthentication — аутентификация прошла успешно;

При создании главного объекта задается IP адрес сервера и порт для подключения. Запуск клиента осуществляется с помощью метода startClient(). Начало подключения сопровождается методом onConnection. Если произошла ошибка подключения, то вызывается метод onDisconnect, который также вызывается при отключении клиента от сервера (например при разрыве соединения или отключении сервера). Если всё произошло в штатном режиме, то завершение процесса подключения ознаменует метод onConnect.

Читайте также:  Ps remote play как подключить андроид

Далее необходимо произвести регистрацию пользователя на сервере, лучше всего делать это после окончания подключения, прямо в методе onConnect:

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

Теперь дело остается за малым — делать запросы и обрабатывать реакцию на приходящие данные.
Чтобы инициировать SQL запрос, необходимо вызвать метод (пример):
String id_request = mainMobileSQLClient.sendSQLRequest(»select * from test;»);
Он, в свою очередь, возвратит идентификатор запроса в виде текстовой строки. Это важно, так как это сетевое приложение, оно работает асинхронно. Когда с сервера приходит новый ответ, то вызывается метод onMessage(String id, DATA_parser data), который передает идентификатор запроса (id), на который пришел ответ и сами данные (data). Данные предоставляются в виде объекта DATA_request, в котором имеются следующие объекты:
status — String — статус результата запроса данных, если «ok», то запрос отработан удачно, иначе «err» (в дальнейшем статусы возможно будут пополняться);
recordsCount — int— количество записей пришедших от сервера, являющиеся результатом запроса;
structure — String[] — текстовый массив, являющийся перечислением названий всех полей ответного запроса;
listData — ArrayList — список массивов данных. Количество элементов в списке соответствует количеству записей с сервера. В каждом элементе находится текстовый массив, с количеством элементов равным количеству элементов в массиве structure.

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

Всё готово! Теперь приступайте к тестированию, отправляйте любые SQL запросы на сервер (создание таблиц, вставка/модификация данных, удаление записей и т.д.) и получайте соответствующие результаты выполнения.

Репозиторий с сервером, клиентом, библиотекой и примером приложения — https://github.com/gc986/MyMobileSQLServer_Utesov
(В настоящее время в репозитории находится самая первая версия проекта подготовленная в формате ADT Eclipse. Следующим этапом станет перевод проекта под формат AndroidStudio)

Вопрос к хабраудитории: где можно применить данное решение?

Источник

Mobi DB — Manage Databases: создание, хранение и управление базами данных

Создавать и управлять персональными базами данных непосредственно с устройства на базе Android поможет Mobi DB — Manage Databases. Средой постоянного хранения пользовательских баз данных (БД), созданных в Mobi DB — Manage Databases, является внутренняя память или SD-карта гаджета, благодаря чему информация будет доступна в любое время и в любом месте, независимо от наличия подключения к интернету. Полноценные клиентские БД для вашего бизнеса или CD/DVD коллекции, книги, рецепты, списки покупок, расходы — Mobi DB поможет создать, управлять и хранить любые базы данных.

Платформа: Android

Версия: 1.0.1.3

Русский интерфейс: Нет

Требования: 4.0 или более поздняя

Категория: Бизнес

Стоимость: Lite-версия – бесплатно, pro-версия – 365 рублей

Дизайн и интерфейс

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

Также спасает ситуацию интуитивный интерфейс, благодаря которому преодолеть языковой барьер будет проще. Пользоваться Mobi DB удобно не только на планшете, но и на смартфоне. На главном экране расположены ярлыки всех имеющихся на устройстве баз данных. Таким образом, переход к каждой из них осуществляется буквально в один клик. Приложение поддерживает как портретную, так и альбомную ориентацию. Программа довольно требовательна к ресурсам. Во время составления и редактирования баз данных заряд аккумулятора тает на глазах. Во время тестирования смартфон несколько раз подвисал, но в общем-то Mobi DB работает стабильно. Все БД хранятся на SD-карте, само приложение в системной памяти занимает меньше двух мегабайт.

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

Шаблоны

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

  • Blank/ Бланк – позволяет создать собственный шаблон из имеющегося набора полей;
  • Books / Книги;
  • СD;
  • Class Schedule / Расписание занятий;
  • DVD;
  • Employees / Сотрудники;
  • Expenses / Расходы;
  • Movies / Фильмы;
  • Orders / Заказы;
  • Purchases / Покупки;
  • Recipes / Рецепты;
  • Salary / Зарплата;
  • Sales / Распродажи;
  • Shopping list / Список покупок;
  • Software / Программное обеспечение;
  • Summer Camp / Летний лагерь;
  • Tasks / Задачи;
  • Vehicle Maintenance / Техническое обслуживание;
  • Wine / Вино.
Читайте также:  Монохромный дисплей для андроид

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

Базы данных

Представим, что у нас небольшой питомник растений, которые мы продаём. Создадим клиентскую базу данных. Для этого можно использовать предустановленный шаблон, например, Orders / Заказы, а можно создать собственный. Мы выбрали второй вариант, так как набор полей в имеющемся шаблоне не вполне совпадает с нашими нуждами. Нажимаем кнопку «+» на главном и экране и выбираем Blank / Бланк. Программа предложит ввести название БД. После этого открывается визуальный редактор приложения во вкладке «Design».

Для создания полей БД снова нажимаем кнопку «+» — «добавить», открывается список предустановленных в приложении полей. Mobi DB имеет 14 типов полей, которые могут использоваться неограниченное количество раз.

  • Text / Текст;
  • Decimal number / Десятичное число;
  • Integer number / Целое число;
  • Checkbox / Кнопка-галочка;
  • Date / Дата;
  • Time / Время;
  • Hyperlink / Гиперссылка;
  • Email;
  • Phone / Номер телефона;
  • Picture / Изображение;
  • Rating / Рейтинг;
  • Address / Адрес;
  • Currency / Валюта;
  • Calculated / Расчёт.

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

После создания шаблона можно приступать к заполнению карточек БД. В нашей базе данных мы использовали не все типы полей, имеющиеся в приложении. Некоторые использовали один раз, а такие, как Text / Текст, Checkbox / Кнопка-галочка использовали несколько раз. Таким образом, Mobi DB даёт полную свободу в составлении персональных баз данных — это безусловный козырь приложения.

После того, как шаблон БД создан, остаётся просто заполнить карточки заказа, что существенно сэкономит время обработки, позволяя оптимизировать бизнес-процессы. Единственный инструмент, которым нам так и не удалось воспользоваться, это Calculated / Расчёт. Сколько мы ни пытались вставить его в наш шаблон, приложение неизменно выдавало ошибку. Разработчики обещают в ближайших обновлениях исправить этот баг.

Ещё одно преимущество Mobi BD — её интеграция с меню телефона и почтовыми приложениями, установленными в смартфоне. Позвонить и написать письмо, можно просто кликнув на соответствующее поле в БД, что очень удобно.

А вот отредактировать на компьютере созданную с помощью Mobi DB базу данных не получится, так как отсутствует клиент приложения для PC. Приложение поддерживает только внутренний Импорт/ Экспорт. Экспорт в формат CSV, поддерживаемый многими офисными программами на ПК, разработчики планируют реализовать в будущем.

Резюме

Mobi DB — Manage Databases позволяет использовать Android-устройства не только для хранения, но и для управления базами данных как в личных, так и в профессиональных целях. Мощный визуальный редактор, возможность создавать собственные шаблоны персональных БД с помощью многочисленных инструментов, реализованных в приложении, делают эту СУБД интересным предложением. Интеграция с электронной почтой и телефоном значительно расширяет способы применения приложения. К сожалению, технические недоработки смазывают впечатление от работы с приложением. Отметим, что это первая версия СУБД, и обновления, исправляющие баги программы, выходят регулярно. Приятно, что создатели Mobi DB предусмотрели возможность протестировать свой продукт. Lite-версия доступна бесплатно, благодаря этому каждый может самостоятельно оценить функционал приложения и принять решение о покупке полной версии.

Плюсы:

  • многообразие шаблонов (возможность хранить базы данных разных типов);
  • визуальный реактор шаблонов;
  • количество полей в шаблоне не ограничено;
  • сортировка информации БД по любому принципу и любой графе;
  • экспорт/импорт БД (в собственном формате);
  • поддержка кириллицы.

Минусы:

  • нерусифицированное меню;
  • отсутствует возможность экспорта / импорта БД в известных форматах (планируется поддержка CSV);
  • отсутствует клиент для PC;
  • ручной ввод всех данных.

Mobi DB Lite — Базы данных
Mobi DB – это программа для хранения всех персональных данных в одном месте.

Источник

Оцените статью