RealmSwift — это популярное решение для баз данных с открытым исходным кодом, которое обеспечивает простой и эффективный способ управления данными в ваших приложениях для iOS и macOS. Он предлагает простой API, который позволяет разработчикам легко сохранять и извлекать данные. В этой статье мы обсудим, как использовать RealmSwift со SwiftUI и как управлять данными между представлениями, используя последнюю информацию о RealmSwift.

Начало работы с RealmSwift и SwiftUI

Чтобы использовать RealmSwift со SwiftUI, первым шагом является добавление RealmSwift в ваш проект с помощью диспетчера пакетов Swift. Вот шаги, которые вам необходимо выполнить:

  1. Откройте Xcode и создайте новый проект.
  2. Нажмите «Файл» -> «Пакеты Swift» -> «Добавить зависимость пакета».
  3. На экране Выбрать репозиторий пакетов введите следующий URL-адрес: github.com/realm/realm-swift.git
  4. Нажмите «Добавить пакет».
  5. Выберите Realm и RealmSwift.
  6. Нажмите «Добавить пакет», чтобы добавить пакет в свой проект.

После того, как вы добавили RealmSwift в свой проект, импортируйте его в файлы проекта:

import SwiftUI
import RealmSwift

Создание объекта области

В SwiftUI вы можете использовать RealmSwift для управления данными, создавая объект Realm и добавляя к нему свойства. Например, допустим, вы хотите создать объект «Человек» со свойствами «имя» и «возраст». Вот как это сделать:

import RealmSwift

class Person: Object, ObjectKeyIdentifiable {
  @Persisted(primaryKey: true) var _id: ObjectId
  @Persisted var name = ""
  @Persisted var age = 0

  convenience init(name: String, age: Int) {
       self.init()
       self.name = name
       self.age = age
   }
}

В этом примере мы создали объект «Человек», который наследуется от класса «Объект», предоставленного RealmSwift. Мы также добавили к объекту два свойства: «имя» и «возраст». Ключевое слово «@Persisted» используется для пометки свойств как динамических, чтобы RealmSwift мог отслеживать их изменения. Мы также наследуем ObjectKeyIdentitude, что позволяет нам использовать эти объекты в циклах List и ForEach.

Сохранение и извлечение данных

Чтобы сохранить новый объект «Человек» в базе данных, вы можете создать экземпляр объекта и добавить его в экземпляр Realm:

let person = Person(name: "John", age: 30)

let realm = try! Realm()
try! realm.write {
  realm.add(person)
}

В этом примере мы создали новый объект «Человек» с именем «Джон» и возрастом 30 лет. Мы также создали экземпляр Realm и добавили в него объект человека с помощью метода «добавить». Наконец, мы вызвали метод «записи» для экземпляра Realm, чтобы зафиксировать изменения в базе данных.

Чтобы получить все объекты «Person» из базы данных, мы собираемся сделать это через представление SwiftUI, используя @ObservedResults:

import SwiftUI
import RealmSwift

struct PeopleView: View {
  @ObservedResults(Person.self) var people

    var body: some View {
        VStack {
            List(people) { person in
                HStack {
                    Text(person.name)
                    Spacer()
                    Text("\(person.age)")
                }
            }
        }
    }
}

struct PeopleView_Previews: PreviewProvider {
    static var previews: some View {
        PeopleView()
    }
}

В этом примере мы создали экземпляр Realm и использовали @ObservedResults для извлечения всех объектов «Person» из базы данных. Мы создали представление, в котором перечислены все объекты «Персона» с указанием их имени и возраста.

Управление данными между представлениями

В SwiftUI мы можем использовать @ObservedResults для извлечения данных из базы данных и @ObservedRealmObject для получения пропущенного объекта в представлении.

Во-первых, давайте сделаем некоторые настройки, чтобы добавить 5 объектов «Person» в базу данных при запуске нашего приложения. Мы собираемся изменить ContentView, созданный при настройке нового приложения SwiftUI.

import SwiftUI
import RealmSwift

struct ContentView: View {
    
    var body: some View {
        PeopleView()
        .task {
            let realm = try! Realm()
            try! realm.write {
                realm.deleteAll()
                
                for _ in 1...5 {
                    realm.add(Person(name: "John", age: 30))
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

В ContentView мы используем .Task для записи объектов 5 Person в область с именем John и возрастом 30 лет. Мы также вызываем PeopleView, который мы создали ранее.

Примечание: я использую здесь realm.deleteAll(), потому что этот код будет постоянно создавать 5 новых объектов при запуске. Это для демонстрационных целей, а не для практики записи данных в приложение.

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

Большой! Теперь мы можем увидеть наш список данных. Теперь мы записали и прочитали данные с помощью Realm. Давайте теперь изменим данные. Нам потребуется внести некоторые изменения в PeopleView.

import SwiftUI
import RealmSwift

struct PeopleView: View {
  @ObservedResults(Person.self) var people

    var body: some View {
        NavigationStack {
            VStack {
                List(people) { person in
                    NavigationLink {
                        PersonView(person: person)
                    } label: {
                        HStack {
                            Text(person.name)
                            Spacer()
                            Text("\(person.age)")
                        }
                    }
                }
            }
        }
    }
}

struct PeopleView_Previews: PreviewProvider {
    static var previews: some View {
        PeopleView()
    }
}

Мы собираемся передать объект человека из нашего списка в другое представление с именем PersonView. Давайте создадим базовый PersonView, который будет принимать объект «Person».

import SwiftUI
import RealmSwift

struct PersonView: View {
    @ObservedRealmObject var person: Person
    
    var body: some View {
        Text("Hello, World!")
    }
}

struct PersonView_Previews: PreviewProvider {
    static var previews: some View {
        PersonView(person: Person(name: "John", age: 30))
    }
}

Потрясающий! Теперь давайте свяжем наш PeopleView с нашим PersonView. Для этого выполните следующие действия:

  1. Вставьте VStack в NavigationStack (здесь также можно использовать NavigationView).
  2. В списке создайте NavigationLink, NavigationLink позволит нам щелкнуть ячейку в нашем списке, чтобы перейти к PersonView.
  3. Добавьте PersonView в раздел назначения NavigationLink. PersonView потребует объект человека. Мы перейдем к одному из нашего списка.
  4. Наконец, в разделе «Метка» NavigationLink мы добавим наш HStack, который содержит имя и возраст объекта «Человек».

На этом этапе мы можем запустить наше приложение, просмотреть список объектов «Person» и перейти к нашему PersonView, щелкнув ячейку в списке.

В следующей части мы добавим несколько текстовых полей в PersonView. Таким образом, мы можем изменить данные объекта «Person», которые мы передали в PersonView.

import SwiftUI
import RealmSwift

struct PersonView: View {
    @ObservedRealmObject var person: Person
    
    var body: some View {
        Form {
            HStack {
                TextField("Name", text: $person.name)
                Spacer()
                TextField("Age", value: $person.age, formatter: NumberFormatter())
            }
        }
    }
}

struct PersonView_Previews: PreviewProvider {
    static var previews: some View {
        PersonView(person: Person(name: "John", age: 30))
    }
}

Мы собираемся изменить пару вещей в этом представлении.

  1. Я поместил HStack в форму. Это даст нам красивую ячейку с информацией в ней.
  2. Мы создаем 2 текстовых поля, равномерно распределенных с помощью Spacer().
  3. Имя TextField довольно простое. Он берет имя поля и текст, которым мы будем манипулировать, из объекта «Человек».
  4. Мы передаем значения как привязки. Вот что означает $. Это позволяет нам изменять данные в TextField, и это изменение записывается в базу данных Realm.
  5. TextField ожидает строку, а age — это Int. У TextField в SwiftUI есть решение для этого. Мы передаем значение и даем ему средство форматирования, которое сделает преобразование для нас. NumberFormatter() встроен в SwiftUI.

На этом этапе, когда мы запускаем приложение, мы видим список из 5 объектов «Person», которые ссылаются на PersonView. В PersonView теперь мы можем изменить значения выбранного объекта. Как только мы изменим эти значения, они будут изменены в базе данных, поэтому, когда мы нажимаем кнопку «Назад», наш список в PeopleView обновляется новыми данными.

Вот оно! Мы сделали это. Мы создали простое приложение, которое использует RealmSwift для записи, чтения и изменения данных в SwiftUI. С RealmSwift мы можем сделать гораздо больше. См. их документацию здесь, https://www.mongodb.com/docs/realm/sdk/swift/swiftui/

Спасибо за чтение! Пожалуйста 👏 хлопайте, оставляйте комментарии и подписывайтесь, мне очень приятно! Это помогает мне узнать, какой контент интересует людей.