Онлайн курсы по Swift

Введение
В этой статье мы расскажем вам как использовать мощное и элегантное решение, мобильную базу данных для ваших приложений iOS: Мобильная база данных Realm. Альтернатива Apple Core Data или SQLite с объектно-реляционной моделью (ORM), Мобильная база данных Realm предоставляет разработчикам простой и понятный путь для сохранения данных и запросов к ним.

 

Что такое мобильная база данных Realm?
Изначально спроектированная как настоящая объектно-ориентированная база данных, Realm отличается от других аналогичных библиотек, тем, что рассматривает объекты данных как живые объекты — это значит, что объекты обновляются синхронно. Они мгновенно реагируют на изменения и легко сохраняются. Вам не придётся изучать крутые диаграммы которые есть в сценариях Core Data или SQLite. Вместо этого вы можете работать по настоящему объектно-ориентированным способом. Мобильная база данных Realm распространяется с открытым исходным кодом с 2016 года и бесплатна для разработчиков.

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

Мобильная платформа Realm, расширена синхронизацией данных в реальном времени и обработкой событий на стороне сервера, которые встроены в приложение. Разработчики используют платформу для создания приложений с мощной функциональностью, такие как мессенджеры, приложения для совместной работы и приложения с оффлайн функционалом. Платформа идеально подходит для адаптации под мобильные устройства существующих API, что позволяет легко создавать удобные и мощные приложения подключённые к устаревшим системам и сервисам. (realm.io)

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

 

Почему именно база данных Realm?
Помимо того, что она уберегает разработчиков от головной боли и изучения крутых диаграмм Core Data, мобильная база данных Realm предоставляет особые преимущества уже готовые к использованию.

 

Производительность & Безопасность потока

С позиции работоспособности было доказано что мобильная база данных Realm выполняет запросы и синхронизирует объекты значительно быстрее, чем Core Data, и осуществляет параллельный доступ к данным без проблем. Это значит, что несколько источников могут получить доступ к одному и тому же объекту без необходимости управлять блокировкой или каких-либо проблем с несогласованностью данных.

 

Шифрование

Мобильная база данных Realm предлагает службы шифрования для защиты базы на диске с помощью AES-256 + SHA2 64-разрядного шифрования.

Это позволяет все данные, хранящиеся на диске зашифровывать и расшифровывать с помощью алгоритма AES-256 и проверять с помощью технологии HMAC SHA-2. Ключ шифрования должен быть сгенерироан каждый раз, когда вы получаете экземпляр Realm.

 

Кроссплатформенность

В отличие от основных данных, мобильная база данных Realm действительно кроссплатформенная и поддерживает iOS, Android, JavaScript веб-приложения и Xamarin.

 

Реактивная природа

Тем способом которым работают живые объекты, вы можете присоединить элементы пользовательского интерфейса к модели данных и ваш интерфейса будет обновлён реактивно как и изменения в данных! Больше нет сложного кода синхронизации или путей логики, необходимых, как если бы вы работали с Core Data.

При совместной работе мобильной платформы Realm и сервером объектов Realm, разработчики получают дополнительные преимущества синхронизации своих данных с облаком, просто указав URL Realm объекта.

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

 

Клиенты
Realm имеет многочисленных уважаемых клиентов, которые открыто применяют мобильную базу данных Realm, среди них Netflix и Starbucks.

 

Альтернативы мобильной базе данных Realm
Конечно, мобильная базы данных Realm это решение не только для работы в памяти приложений. Я уже упоминал Core Data принадлежащий Apple, и хотя он изначально сложный в изучении, тот факт, что он принадлежит Apple означает он будет де-факто решением для многих разработчиков iOS и будут иметь большое сообщество разработчиков и поддержку.

Решение, которое было схоже с мобильной базой Realm это Google Firebase — хотя это комбинированное решение клиента и сервера. Firebase так же прост в использовании и позволяет начать работу бесплатно, но расходы будут возрастать пропорционально использованию ресурсов. Недостаток у Firebase, это то что вы привязаны к их платформе, тогда как с Realm вы можете использовать свою собственную панель управления — или не использовать её вообще!

 

Ваше первое приложение Realm

 

Необходимые знания
Это руководство предполагает, что вы работали со Swift, но нет необходимости знания Core Data или других баз данных.

Также как и Realm мы будем использовать следующие части iOS:

  • UIKit: для визуализации наших данных
  • CocoaPods: сторонняя библиотека, которая будет использоваться для установки мобильной базы данных Realm

 

Цели этого урока
К концу этого урока вы разработаете простое приложение to-do, написанное на Swift с использованием мобильной базы данных Realm для сохранения данных локально. Вы получите полнофункциональный, созданный на Realm приложение to-do, и попутно изучите следующие концепции:

  1. Настройка библиотеки Realm для нового проекта с помощью CocoaPods
  2. Настройка App Delegate для импорта библиотеки Realm
  3. Создание «живых» объектов модели
  4. Создание представления контроллеров и панели в пользовательском интерфейсе
  5. Подключение модели данных к контроллерам представления и предствлениям

 

Настройка проекта

Итак, давайте создадим наше приложение Realm: RealmDo. Мы собираемся создать новый проект Xcode, так что переходим дальше и создаём приложение Master-Detail.

 

 

Затем, если CocoaPods не установлен на вашем компьютере, вам нужно сделать это сейчас. Переходите в терминал и введите следующую команду:

$ sudo gem install cocoapods

Вы должны получить подтверждение что cocoapods установлен. Пока вы все еще в терминале, перейдите к только что созданному проекту Xcode и введите следующую команду, чтобы инициализировать новый Podfile:

$ pod init

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

Далее мы должны добавить библиотеку cocoapod для Realm, так что открывайте Podfile в текстовом редакторе и добавляйте следующие код # Pods for RealmDo:

...
    use dynamic frameworks
    use_frameworks!
 
  # Pods for RealmDo
    pod 'RealmSwift'
 
  target 'RealmDoTests' do
...

Сохраните файл, выходите и набирайте:

pod install

После завершения установки библиотеки CocoaPods попросит закрывать наш проект Xcode и открыть рабочую область. Сделайте это, и мы будем готовы приступить к программированию. Мы начнем с AppDelegate.

 

Настройка делегата App Delegate для импорта библиотеки Realm
В нашем AppDelegate мы импортируем библиотеку Realm, поэтому добавьте следующую запись в файл AppDelegate.swift:

import UIKit
import RealmSwift
 
@UIApplicationMain
class AppDelegate:. ..

Оставьте класс, таким какой он есть, и обратим наше внимание на объект модели.

 

Модели «живых» объектов

Определение модели в Realm убийственна проста; вы просто создаёте класс логической модели. В нашем проекте мы будем хранить напоминания, поэтому давайте создадим класс под названием Reminder.swift, с помощью следующего кода:

import RealmSwift
class Reminder: Object {
    dynamic var name = ""
    dynamic var done = false
}

В этом уроке нам нужно только модель Reminder, так что мы все сделали! Это очень просто и создание экземпляров модели так же проста, о чём мы узнаем позже.

 

Настройка контроллеров представления и панели

Теперь мы обратим наше внимание на представлении контроллеров, но прежде чем мы перейдем к классу MasterViewController.swift, давайте откроем Main.storyboard и добавим панель кнопки в верхний правый угол, назовём его Add, как показано ниже:

 

 

 

Проект был инициализирован Xcode в datasource и delegate связанным с контроллером представления, поэтому все, что нам нужно сделать, это добавить кнопку, которую мы только что создали для контроллера представления IBOutlet. Удерживая и перетаскивая кнопку к контроллеру представления в режиме сплит-просмотра, чтобы создать ссылку.

 

 

 

 

Инициализация Realm
Перейдём к файлу MasterViewController.swift, мы объявляем переменные которые нам нужны, эти действия выглядят примерно следующим образом:

class MasterViewController: UITableViewController {
 
    var realm : Realm! //(1)
    @IBOutlet weak var addButton: UIBarButtonItem!
 
    var remindersList: Results<Reminder> {     //(2)
        get {
            return realm.objects(Reminder.self)
        }
    }
      override func viewDidLoad() {                 //(3)
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
            realm = try! Realm()
    }
…

Сначала в строке (1), мы объявляем Realm, переменную, на которую мы будем ссылаться чтобы добраться до нашего хранилища данных. Затем мы загружаем remindersList называемый объектами Realm для получения всего списка напоминаний. Наконец, мы инициируем переменную Realm, которую мы объявили в начале. Пока ничего слишком сложного!

 

Настройка View Delegate и Datasource
Далее, мы устанавливаем наши tableView методы delegate и datasource, следующим образом:

override func numberOfSections(in tableView: UITableView) -> Int {  
        return 1
    }
 
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {      // (4)
        return remindersList.count
    }
 
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
 
        let item = remindersList[indexPath.row]
 
        cell.textLabel!.text = item.name        // (5)
        cell.textLabel!.textColor = item.done == false ? UIColor.black : UIColor.lightGray
 
        return cell
    }

В строке (4) мы получаем количество remindersList списка объектов, которые установят счетчик на количество рядов в нашем разделе tableView.

Затем для каждой ячейки, мы получим свойство живого объекта Reminder для создания метки, а также как отметки выполнен объект или нет.

 

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

override func tableView(_ tableView: UITableView,
                   didSelectRowAt indexPath: IndexPath) {
 
        let item = remindersList[indexPath.row]
        try! self.realm.write({     // (6)
            item.done = !item.done
        })
 
        //refresh rows
        tableView.reloadRows(at: [indexPath], with: .automatic)
 
    }
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }
 
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
 
        if (editingStyle == .delete){
            let item = remindersList[indexPath.row]
            try! self.realm.write({
                self.realm.delete(item)     // (7)
            })
 
            tableView.deleteRows(at:[indexPath], with: .automatic)
 
        }
 
    }

В строке (6) это первый раз, когда мы записываем в нашу базу данных, которую вы можете выполнить внутри контейнера self.realm.write. Обратите внимание, что все, что вам нужно сделать с экземпляром объекта это установить его значение, и ничего больше. Поэтому в данном случае мы переключаем значение done, делая его item.done =! item.done.

Строка (7) это наш второй пример написания запроса в нашу базу данных: мы удалим объект из базы данных, удалив объект экземпляра.

 

Добавление новых объектов
Мы сделали большой прогресс, и на самом деле мы почти закончили! Теперь мы можем загружать, редактировать и удалять наши напоминания, но нам не хватает одного из важных действий: Добавление нового напоминания. Чтобы выполнить это, создайте новый метод @IBAction и привяжите ваш макет кнопки Добавить из панели к методу.

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

Теперь, переходите дальше и добавьте следующий код:

@IBAction func addReminder(_ sender: Any) {
 
        let alertVC : UIAlertController = UIAlertController(title: "New Reminder", message: "What do you want to remember?", preferredStyle: .alert)
 
        alertVC.addTextField { (UITextField) in
 
        }
 
        let cancelAction = UIAlertAction.init(title: "Cancel", style: .destructive, handler: nil)
 
        alertVC.addAction(cancelAction)
 
        //Alert action closure
        let addAction = UIAlertAction.init(title: "Add", style: .default) { (UIAlertAction) -> Void in
 
            let textFieldReminder = (alertVC.textFields?.first)! as UITextField
 
            let reminderItem = Reminder()       // (8)
            reminderItem.name = textFieldReminder.text!
            reminderItem.done = false
 
            // We are adding the reminder to our database
            try! self.realm.write({
                self.realm.add(reminderItem)    // (9)
 
                self.tableView.insertRows(at: [IndexPath.init(row: self.remindersList.count-1, section: 0)], with: .automatic)
            })
 
        }
 
        alertVC.addAction(addAction)
 
        present(alertVC, animated: true, completion: nil)
 
    }

В строке (8) мы создаем новый экземпляр напоминания и задаём его свойства. Затем в строке (9) мы добавляем напоминание через self.realm.add(item)

 

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

 

 

 

Браузер Realm

И вот оно! Практически без обучения, минуя сложности работы с основными данными мы получили полнофукнциональную серверную часть на девайсе. Это и есть база данных Realm. Можно также проверить, что данные хранятся на устройстве, загрузив браузер Realm, macOS приложение, которое позволяет просматривать, осуществлять отладку и редактировать объекты данных Realm.

Скачайте приложение из Mac App Store и откройте базу данных Realm, которая расположена в папке CoreSimulator/Devices/appID/data/…. Db.realm файл, который вы ищете.

 

 

 

 

Открыв его, вы сможете не только просматривать данные, но также редактировать и добавлять новые. Вперёд, попробуйте!

 

 

 

Заключение

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

Затем мы создали простое приложение «напоминалку», на основе базы данных Realm. Всего в нескольких десятках строк кода мы смогли:

  1. Установили «живую» объектную модель для «напоминалки»
  2. Привязали наш вид контроллера к модели данных
  3. Объявляли, регистрировали, загружали, добавляли и удаляли из базы данных Realm

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

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

И пока вы ещё здесь, не забудьте почитать некоторые из наших статей на тему разработки приложений для iOS!

Пролистать наверх