Ich habe versucht, Realm mit Swift UI zu verwenden

Einführung

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. ezgif.com-video-to-gif.gif

Umgebung

Swift 5.3 Xcode 12.0.1 Cocoapods 1.9.3 RealmSwift 5.4.7

Hintergrund

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.

Implementiertes Verhalten

・ 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

Quellcode

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

Referenzierte Site

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.

abschließend

Vielen Dank für das Lesen bis zum Ende. Ich hoffe, es hilft Leuten, die Swift UI und Realm verwenden.

Recommended Posts

Ich habe versucht, Realm mit Swift UI zu verwenden
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe versucht, Scalar DL mit Docker zu verwenden
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Ich habe versucht, Gson zu benutzen
Ich habe versucht, TestNG zu verwenden
Ich habe versucht, Galasa zu benutzen
Beginnend mit Swift Swift UI
[Android] Ich habe SQLite beendet und versucht, Realm zu verwenden
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
Ich habe DI mit Ruby versucht
Ich habe versucht, Azure Cloud-Init zu verwenden
Ich habe versucht, Apache Wicket zu verwenden
Ich habe versucht, Java REPL zu verwenden
Ich habe UPSERT mit PostgreSQL ausprobiert.
Ich habe BIND mit Docker ausprobiert
[Swift] Ich habe versucht, mit UICollectionView eine Instagram-ähnliche Benutzeroberfläche mit nur Code ohne Storyboard zu implementieren
Ich habe versucht, mit Swagger mit Spring Boot zu beginnen
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
Ich habe jetzt versucht, Anakia + Jing zu verwenden
Ich habe versucht, Spring + Mybatis + DbUnit zu verwenden
Ich habe eine morphologische Analyse mit MeCab versucht
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, JWT in Java zu verwenden
Ich habe GraphQL mit Spring Boot ausprobiert
[Android] Ich habe versucht, das Koordinatorlayout zu verwenden.
Ich habe Flyway mit Spring Boot ausprobiert
Ich habe versucht, Pari GP Container zu verwenden
Ich habe versucht, WebAssembly Stadio (Version 2018/4/17) zu verwenden.
Ich habe versucht, Slim mit Scaffold anzupassen
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe versucht, Google HttpClient von Java zu verwenden
Ich habe versucht, mithilfe von JDBC Template mit Spring MVC eine Verbindung zu MySQL herzustellen
[Swift] Ich habe versucht, ColorPicker (den, der die Farbe leicht auswählen kann) zu verwenden, der in iOS14 hinzugefügt wurde. [SwiftUI]
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Passen Sie die Ansicht mit dem Ansichtsmodifikator in der Swift-Benutzeroberfläche an
Ich habe versucht, das Java-Diagnosetool Arthas zu verwenden
Ich habe versucht, UICollectionViewListCell zu verwenden, das von Xcode12 hinzugefügt wurde.
Ich habe versucht, mit Web Assembly zu beginnen
Ich habe mit Studyplus zeitsparendes Management-Lernen versucht.
Es ist neu, aber ich habe versucht, Groonga zu verwenden
Ich habe versucht, ein wenig mit BottomNavigationView zu spielen ①
Ich habe Lazy Initialization mit Spring Boot 2.2.0 ausprobiert
Ich habe mit Thymeleaf meinen eigenen Dialekt erstellt und eingestellt und versucht, ihn zu verwenden
[iOS] Ich habe versucht, mit Swift eine insta-ähnliche Verarbeitungsanwendung zu erstellen
Schnelle UI 100 klopft
[Für Anfänger] Ich habe versucht, DBUnit mit Eclipse zu verwenden
Ich habe versucht, AdoptOpenJDK 11 (11.0.2) mit dem Docker-Image zu überprüfen
Ich habe versucht, die Federbeinkonfiguration mit Coggle zu verwalten
[Für Anfänger] Ich habe versucht, JUnit 5 mit Eclipse zu verwenden
Ich habe versucht, Anmeldeinformationen mit JMX zu verwalten