База данных Realm в iOS разработке
Антонов Владислав Александрович, студент магистратуры
Чувашский государственный университет имени И. Н. Ульянова (г. Чебоксары)
В этой статье разобраны основные принципы работы с базой данных Realm: создание модели, выполнение запросов и обновление записей, которые применяются при разработке iOS приложений, при использовании языка Swift.
Ключевые слова: программирование, база данных, мобильная разработка, Swift.
Realm — это кроссплатформенная база данных, разработанная для мобильных приложений, и которая является хорошей альтернативой Core Data в iOS разработке.
Для того, чтобы интегрировать Realm в свой проект необходимо воспользоваться менеджером зависимостей CocoaPods. В корневой папке проекта создайте новый файл Podfile и добавьте в него следующий код:
Сохраните и закройте его. Теперь откройте папку проекта в терминале и выполните команду pod install, тем самым CocoaPods обратится к Podfile файлу и установит все необходимые библиотеки и фреймворки, которые там указаны.
После этого, чтобы все установленные библиотеки стали доступны в проекте, необходимо продолжить работу с созданным после установки подов файлом Project Name.xcworkspace.
Чтобы получить доступ к базе данных в определенном файле приложения, перед этим необходимо импортировать базу стандартным import RealmSwift в начале файла.
В создании моделей, Realm использует классы. Для примера давайте условно создадим модель пользователя:
В этом примере все значения или пустая строка или равняются нулю, потому что сейчас только определяется модель и этими значениями указывается, какой тип данных должен храниться в той или иной переменной. Конкретно, в этом примере, все значения обязательно должны быть указаны при создании объекта, но также Realm поддерживает и опциональные значения.
В Таблице 1 можно подробно ознакомиться с типами данных в модели:
Таблица 1
Тип |
Обязательное значение |
Опциональное значение |
Bool |
@objc dynamic var value = false |
let value = RealmOptional
|
Int |
@objc dynamic var value = 0 |
let value = RealmOptional
|
Float |
@objc dynamic var value: Float = 0.0 |
let value = RealmOptional
|
Double |
@objc dynamic var value: Double = 0.0 |
let value = RealmOptional
|
String |
@objc dynamic var value = "" |
@objc dynamic var value: String? = nil |
Data |
@objc dynamic var value = Data() |
@objc dynamic var value: Data? = nil |
Date |
@objc dynamic var value = Date() |
@objc dynamic var value: Date? = nil |
Object |
Обязательно опциональный |
@objc dynamic var value: Class? |
List |
let value = List
|
Только обязательное значение |
LinkObj |
let value = LinkingObjects(fromType: Class.self, property: "property") |
Только обязательное |
Экземпляры класса Object — это «живые», автоматически обновляемые представления данных. При изменении свойств объекта его не нужно обновлять. Изменение его свойств будет немедленно применено в любых других экземплярах, ссылающихся на тот же самый объект.
Создать новый объект можно несколькими способами. Наиболее очевидным является использование назначенного инициализатора для создания объекта, но также объекты можно создавать из словарей, используя соответствующие ключи и значения:
Давайте создадим экземпляр модели пользователя и заполним её:
Для того, чтобы сохранить её внутри базы необходимо выполнить следующий код:
Готово, теперь созданный объект хранится внутри базы данных. Вот таким несложным способом можно добавлять данные в Realm.
После того, как добавили объект в базу, можно продолжить использовать его, и все изменения, которые в него внесены, будут сохранены. Любые изменения будут доступны другим потокам, использующим то же самый экземпляр Realm, когда транзакция записи будет зафиксирована.
Это не только делает Realm быстрым и эффективным, но и позволяет коду быть более простым и читаемым. Если интерфейс приложения зависит от конкретного объекта Realm, не нужно беспокоиться об обновлении или перезагрузке его перед тем, как обновить UI. Можно подписаться на уведомления Realm, чтобы знать, когда данные в объекте Realm изменяются, чтобы оследить, когда UI приложения должен быть обновлен.
А теперь, чтобы воспользоваться этими данными и, к примеру, изменить имя пользователя с “Mark” на “Luke”, давайте найдем его внутри базы данных через фильтрацию по id:
Если же объект необходимо удалить из базы, то сделать это можно следующим образом:
Работая с любой базой данных, рано или поздно встанет вопрос, что модели необходимо изменить, например, добавить или удалить из них какие-нибудь свойства. Так как Realm использует для определения моделей стандартные классы Swift, изменять модели легко как любой другой класс, просто удалив определение переменной. Давайте вернемся к объекту User и удалим из него значение secondName. После этого он будет выглядеть вот так:
После этих изменений при запуске приложения, если уже сохранили какой-нибудь объект с предыдущей версией модели, то возникнет несоответствие между тем, что Realm видит в коде, и данными, которые уже хранит Realm. Когда это произойдет, при попытке работы с базой будет возникать ошибка, и чтобы это исправить необходимо провести миграцию данных от старой модели к новой. Код всех миграций должен находиться в AppDelegate вашего приложения внутри функции application (application:didFinishLaunchingWithOptions:):
Давайте подробно разберемся в коде выше. Создан новый объект конфигурации и в нем указана новая версия схемы. Она должна быть выше, чем предыдущая. Если до этого версия схемы не была указан, то стандартно она равняется 0. После этого идет migrationBlock, который автоматически вызывается, когда открывается Realm, версия схемы которого ниже, чем указанная выше. И далее стандартными if/else конструкциями можно более точно настроить каждую из миграций. Конкретно в данном случае, для того чтобы удалить одно из свойств модели, не нужно делать ничего, кроме как указать то, что версия схемы изменилась. Realm автоматически определяет новые и удаленные свойства. Далее необходимо указать, как использовать новый объект конфигурации для стандартного хранилища Realm. После этого при вызове любого экземпляра Realm миграция произойдет автоматически.
В данной статье произведен обзор базы данных Realm, на примере использования её в iOS разработке. Рассмотрен основной функционал, как интегрировать базу данных в проект, добавление, изменение и удаление записей из хранилища базы данных.