Ich habe eine Beispiel-App mit Realm mit Swift UI erstellt. Es hat eine Weile gedauert, bis ich es verstanden habe, also schreibe ich es als meine eigene Ausgabe. ↓ Es ist eine Anwendung, die so funktioniert. Die Zahl rechts wird zufällig von 0 bis 100 erhalten.
Swift 5.3 Xcode 12.0.1 Cocoapods 1.9.3 RealmSwift 5.4.7
Vor kurzem bin ich Realm zum ersten Mal in Swift begegnet und habe mich gefragt, wie es in der Swift-Benutzeroberfläche implementiert werden kann. Deshalb habe ich mich damit befasst.
・ Schaltfläche Hinzufügen "Erster Titel" und eine Reihe von Zufallszahlen von 0 bis 100 zur Liste hinzugefügt ・ Papierkorbmarkierung Löschen Sie die entsprechende Zeile ・ Schaltfläche Alle löschen Löschen Sie alle Zeilen ・ Halten Sie den Zeilentitel gedrückt "Erster Titel" in "Geänderter Titel" umbenannt und Zufallszahlen wiedererlangt ・ Als Bereich speichern Speichern Sie Daten, auch wenn Sie die App löschen
Schreiben Sie zunächst den Code, der die Datenquelle darstellt.
ItemDB.swift
import RealmSwift
//Klasse für Reich
class ItemDB: Object {
@objc dynamic var id = 0
@objc dynamic var title = ""
@objc dynamic var number = 0
//Verwenden Sie den Primärschlüssel, um Daten zu aktualisieren oder zu löschen
override static func primaryKey() -> String? {
"id"
}
}
Item.swift
import Foundation
struct Item: Identifiable {
let id: Int
let title: String
let number: Int
}
extension Item {
init(itemDB: ItemDB) {
id = itemDB.id
title = itemDB.title
number = itemDB.number
}
}
ItemStore.swift
import RealmSwift
final class ItemStore: ObservableObject {
private var itemResults: Results<ItemDB>
//Legen Sie die DB-Daten in itemResults fest
init(realm: Realm) {
itemResults = realm.objects(ItemDB.self)
}
var items: [Item] {
itemResults.map(Item.init)
}
}
Die folgenden Methoden zum Betreiben der Datenbank werden auch in ItemStore.swift beschrieben. Es dient zur Durchführung der oben implementierten Operation.
--create (Daten hinzufügen) --aktualisieren --löschen --deleteAll (alle Daten löschen)
ItemStore.swift
extension ItemStore {
//Daten hinzufügen
func create() {
//Wenn Sie dies nicht schreiben, können Sie View of DB-Änderungen nicht mitteilen.
objectWillChange.send()
do {
let realm = try Realm()
let itemDB = ItemDB()
itemDB.id = UUID().hashValue
itemDB.title = "First Title"
itemDB.number = Int.random(in: 0...100)
try realm.write {
realm.add(itemDB)
}
} catch let error {
print(error.localizedDescription)
}
}
//Daten aktualisieren
func update(itemID: Int) {
objectWillChange.send()
do {
let realm = try Realm()
try realm.write {
realm.create(ItemDB.self,
value: ["id": itemID, "title": "Changed Title", "number": Int.random(in: 0...100)],
update: .modified)
}
} catch let error {
print(error.localizedDescription)
}
}
//Daten löschen
func delete(itemID: Int) {
objectWillChange.send()
guard let itemDB = itemResults.first(where: { $0.id == itemID})
else {
return
}
do {
let realm = try Realm()
try realm.write {
realm.delete(itemDB)
}
} catch let error {
print(error.localizedDescription)
}
}
//Löschen Sie alle Daten
func deleteAll() {
objectWillChange.send()
do {
let realm = try Realm()
try realm.write {
realm.deleteAll()
}
} catch let error {
print(error.localizedDescription)
}
}
}
Als nächstes werde ich den Code schreiben, der Ansicht sein wird.
ItemRowView.swift
import SwiftUI
struct ItemRowView: View {
@EnvironmentObject var store: ItemStore
let item: Item
var body: some View {
HStack{
Text(item.title)
//Halten Sie den Titel gedrückt, um die Daten zu aktualisieren
.onLongPressGesture {
store.update(itemID: item.id)
}
Spacer()
Text(String(item.number))
//Installieren Sie den Papierkorb und löschen Sie ihn
Image(systemName: "trash.circle.fill")
.resizable()
.frame(width: 24, height: 24)
.foregroundColor(.red)
.onTapGesture {
store.delete(itemID: item.id)
}
}
}
}
ItemListView.swift
import SwiftUI
struct ItemListView: View {
@EnvironmentObject var store: ItemStore
let items: [Item]
var body: some View {
List {
Section(header: sectionHeaderView) {
ForEach(items) { item in
HStack{
ItemRowView(item: item)
}
}
}
}
.navigationTitle("RealmDB-Liste")
}
//Schaltfläche "Hinzufügen" und Schaltfläche "Löschen" in der Kopfzeile
var sectionHeaderView: some View {
HStack {
Button("hinzufügen", action: store.create)
Spacer()
Button("Alles löschen", action: store.deleteAll)
}
}
}
ContentView.swift
import SwiftUI
struct ContentView: View {
@EnvironmentObject var store: ItemStore
var body: some View {
NavigationView {
ItemListView(items: store.items)
}
}
}
Zum Schluss schreiben Sie einen Teil von "SceneDelegate.swift" neu und fertig.
SceneDelegate.swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if let windowScene = scene as? UIWindowScene {
do {
let realm = try Realm()
let window = UIWindow(windowScene: windowScene)
//Wo wird Realm zuerst geladen?
let contentView = ContentView()
.environmentObject(ItemStore(realm: realm))
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
} catch let error {
fatalError("Failed to open Realm. Error: \(error.localizedDescription)")
}
}
}
** Klicken Sie hier für den gesamten Quellcode ** https://github.com/takuma-2531/SwiftUI_Realm_1To1
https://www.raywenderlich.com/12235561-realm-with-swiftui-tutorial-getting-started Diese Seite war am einfachsten zu verstehen, als ich untersuchte, wie man Realm mit SwiftUI verwendet. Obwohl es auf Englisch ist, habe ich es mit Google-Übersetzung gelesen. Das obige Beispiel ist eine einfachere Version des Codes auf dieser Site.
Vielen Dank für das Lesen bis zum Ende. Ich hoffe, es hilft Leuten, die Swift UI und Realm verwenden.
Recommended Posts