RealmSwift — это популярное решение для баз данных с открытым исходным кодом, которое обеспечивает простой и эффективный способ управления данными в ваших приложениях для iOS и macOS. Он предлагает простой API, который позволяет разработчикам легко сохранять и извлекать данные. В этой статье мы обсудим, как использовать RealmSwift со SwiftUI и как управлять данными между представлениями, используя последнюю информацию о RealmSwift.
Начало работы с RealmSwift и SwiftUI
Чтобы использовать RealmSwift со SwiftUI, первым шагом является добавление RealmSwift в ваш проект с помощью диспетчера пакетов Swift. Вот шаги, которые вам необходимо выполнить:
- Откройте Xcode и создайте новый проект.
- Нажмите «Файл» -> «Пакеты Swift» -> «Добавить зависимость пакета».
- На экране Выбрать репозиторий пакетов введите следующий URL-адрес: github.com/realm/realm-swift.git
- Нажмите «Добавить пакет».
- Выберите Realm и RealmSwift.
- Нажмите «Добавить пакет», чтобы добавить пакет в свой проект.
После того, как вы добавили 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. Для этого выполните следующие действия:
- Вставьте VStack в NavigationStack (здесь также можно использовать NavigationView).
- В списке создайте NavigationLink, NavigationLink позволит нам щелкнуть ячейку в нашем списке, чтобы перейти к PersonView.
- Добавьте PersonView в раздел назначения NavigationLink. PersonView потребует объект человека. Мы перейдем к одному из нашего списка.
- Наконец, в разделе «Метка» 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)) } }
Мы собираемся изменить пару вещей в этом представлении.
- Я поместил HStack в форму. Это даст нам красивую ячейку с информацией в ней.
- Мы создаем 2 текстовых поля, равномерно распределенных с помощью Spacer().
- Имя TextField довольно простое. Он берет имя поля и текст, которым мы будем манипулировать, из объекта «Человек».
- Мы передаем значения как привязки. Вот что означает $. Это позволяет нам изменять данные в TextField, и это изменение записывается в базу данных Realm.
- TextField ожидает строку, а age — это Int. У TextField в SwiftUI есть решение для этого. Мы передаем значение и даем ему средство форматирования, которое сделает преобразование для нас. NumberFormatter() встроен в SwiftUI.
На этом этапе, когда мы запускаем приложение, мы видим список из 5 объектов «Person», которые ссылаются на PersonView. В PersonView теперь мы можем изменить значения выбранного объекта. Как только мы изменим эти значения, они будут изменены в базе данных, поэтому, когда мы нажимаем кнопку «Назад», наш список в PeopleView обновляется новыми данными.
Вот оно! Мы сделали это. Мы создали простое приложение, которое использует RealmSwift для записи, чтения и изменения данных в SwiftUI. С RealmSwift мы можем сделать гораздо больше. См. их документацию здесь, https://www.mongodb.com/docs/realm/sdk/swift/swiftui/
Спасибо за чтение! Пожалуйста 👏 хлопайте, оставляйте комментарии и подписывайтесь, мне очень приятно! Это помогает мне узнать, какой контент интересует людей.