Сложности с выбором «БД»

Желание сделать качественный продукт влияет на выбор определенных классов/библиотек. Самые серьезные требования предъявляются к выбору механизма воспроизведения музыки и к выбору базы данных для хранения списков музыки. О выборе библиотеки для воспроизведения музыки мы уже писали ранее. Хотелось бы поделиться мыслями по поводу выбора базы данных.

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

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

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

Вручную проверять все плейлисты на наличие совпадений с загрузками — дело ресурсозатратное. За нас это должна делать БД в автоматическом режиме.


Core Data

Первым делом было решено использовать Core Data, ведь это продукт компании Apple. И разрабатывался он специально для облегчения жизни iOS разработчикам.

Библиотека показала себя очень хорошо практически со всех сторон. Легко интегрируется, максимально наглядно настраивается и имеет очень крутой класс NSFetchedResultsController, который позволяет в режиме реального времени отслеживать все изменения в БД и моментально отображать все изменения в плейлистах.

Внедрение проходило достаточно успешно пока не дошли до момента подгрузки больших плейлистов (до 6000 песен). Синхронизация происходила крайне долго: плейлист размером 2500 песен на iPhone 5 обрабатывался около 10 секунд и это без учета времени на подгрузку плейлиста с серверов ВКонтакте. По задумке пользователь должен беспрепятственно переходить по плейлистам любых размеров и сдерживать пользователя может только скорость его интернет соединения. Как бы жалко не было отказываться от проделанной работы, использование Core Data на этом было прекращено.


FMDB, sqlite и прочие страшные слова…

Решили попробовать «пообщаться» с sqlite базой данных через очень популярную оболочку FMDB. Прошло несколько дней и уже не осталось и следа от Core Data. Прежние структура и логика были реализованы через FMDB. Повторяем опять тот же тест при тех же условиях (2500 песен, iPhone 5) и получаем время выполнения 0.5 сек. Неужели нашли то, что искали?

Осталось дело за малым, надо найти механизм, который будет похож на упомянутый выше класс NSFetchedResultsController и который можно будет использовать вместе с FMDB. Не нашли…


…но что-то все-таки нашли!

YapDatabase

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

Concurrency. You can read from the database while another thread is simultaneously making modifications to the database.

Built-In Caching. A configurable object cache is built-in.

Performance. Fetch thousands of objects on the main thread without dropping a frame.

Как и обещали авторы библиотеки: всего за 30 минут удалось внедрить библиотеку и сделать необходимые настройки для тестирования скорости синхронизации плейлиста.  И снова повторяем тот же тест при тех же условиях (2500 песен, iPhone 5) и получаем время выполнения 0.3 сек. Результат сравним с результатом использования FMDB, однако YapDatabase имеет преимущество: отлично продуманный механизм обновления содержимого в режиме реального времени при появлении изменений в БД.

Views allow you Sort, Group & Filter your data. Perfect for tableViews, collectionViews, and more. And they even provide NSFetchedResultsController style updates to make it easy to animate changes to your tableViews/collectionViews.

На момент написания этой заметки началось полномасштабное внедрение YapDatabase в структуру приложения.

Похожие статьи

Сложности с выбором «БД»: 1 комментарий

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *