J'ai essayé d'utiliser Realm avec Swift UI

introduction

J'ai créé un exemple d'application à l'aide de Realm avec Swift UI. Il m'a fallu un certain temps pour comprendre, donc je l'écris comme ma propre sortie. ↓ C'est une application qui fonctionne comme ça. Le nombre de droite est obtenu aléatoirement de 0 à 100. ezgif.com-video-to-gif.gif

environnement

Swift 5.3 Xcode 12.0.1 Cocoapods 1.9.3 RealmSwift 5.4.7

Contexte

Récemment, j'ai rencontré pour la première fois Realm dans Swift et je me demandais comment il pouvait être implémenté dans Swift UI, alors j'ai commencé à l'examiner.

Comportement mis en œuvre

・ Bouton Ajouter Ajout du "premier titre" et d'une ligne de nombres aléatoires de 0 à 100 à la liste ・ Marque de la poubelle Supprimer la ligne correspondante ・ Bouton Supprimer tout Supprimer toutes les lignes ・ Appuyez et maintenez le titre de la ligne "Premier titre" renommé en "Titre modifié" et réacquis des nombres aléatoires ・ Enregistrer en tant que royaume Enregistrez les données même si vous déposez l'application

Code source

Tout d'abord, écrivez le code qui est la source des données.

ItemDB.swift


import RealmSwift
//Classe pour le royaume
class ItemDB: Object {
  @objc dynamic var id = 0
  @objc dynamic var title = ""
  @objc dynamic var number = 0
  
  //Utilisez la clé primaire pour mettre à jour ou supprimer des données
  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>
  
  //Définir les données DB dans itemResults
  init(realm: Realm) {
    itemResults = realm.objects(ItemDB.self)
  }
  
  var items: [Item] {
    itemResults.map(Item.init)
  }
}

Les méthodes suivantes pour faire fonctionner la base de données sont également décrites dans ItemStore.swift. C'est pour effectuer l'opération implémentée ci-dessus.

--create (ajouter des données) --mise à jour --supprimer --deleteAll (supprimer toutes les données)

ItemStore.swift


extension ItemStore {
  //Ajouter des données
  func create() {
    //Si vous n'écrivez pas ceci, vous ne pourrez pas indiquer à View des modifications de la base de données.
    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)
    }
  }
  
  //Mettre à jour les données
  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)
    }
  }
  
  //Suprimmer les données
  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)
    }
  }
  
  //Supprimer toutes les données
  func deleteAll() {
    objectWillChange.send()
    
    do {
      let realm = try Realm()
      try realm.write {
        realm.deleteAll()
      }
    } catch let error {
      print(error.localizedDescription)
    }
  }
}

Ensuite, j'écrirai le code qui sera View.

ItemRowView.swift


import SwiftUI

struct ItemRowView: View {
  @EnvironmentObject var store: ItemStore
  let item: Item
  
  var body: some View {
    HStack{
      Text(item.title)
        //Appuyez et maintenez le titre pour mettre à jour les données
        .onLongPressGesture {
          store.update(itemID: item.id)
        }
      Spacer()
      Text(String(item.number))
      //Installer la marque de la corbeille et mettre en œuvre la suppression
      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("Liste RealmDB")
  }
  
  //Ajouter un bouton et supprimer un bouton dans l'en-tête
  var sectionHeaderView: some View {
    HStack {
      Button("ajouter à", action: store.create)
      Spacer()
      Button("Tout supprimer", action: store.deleteAll)
    }
  }
}

ContentView.swift


import SwiftUI

struct ContentView: View {
  @EnvironmentObject var store: ItemStore
  
  var body: some View {
    NavigationView {
      ItemListView(items: store.items)
    } 
  }
}

Enfin, réécrivez une partie de "SceneDelegate.swift" et c'est fait.

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)
      //Où charger le royaume en premier
      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)")
    }      
  }
}

** Cliquez ici pour le code source complet ** https://github.com/takuma-2531/SwiftUI_Realm_1To1

Site référencé

https://www.raywenderlich.com/12235561-realm-with-swiftui-tutorial-getting-started Ce site était le plus simple à comprendre lorsque j'ai étudié comment utiliser Realm avec SwiftUI. Bien qu'il soit en anglais, je l'ai lu en utilisant la traduction de Google. L'exemple ci-dessus est une version plus simple du code sur ce site.

en conclusion

Merci d'avoir lu jusqu'au bout. J'espère que cela aidera les personnes qui utilisent Swift UI et Realm.

Recommended Posts

J'ai essayé d'utiliser Realm avec Swift UI
J'ai essayé d'utiliser JOOQ avec Gradle
J'ai essayé d'utiliser Scalar DL avec Docker
J'ai essayé d'utiliser OnlineConverter avec SpringBoot + JODConverter
J'ai essayé d'utiliser OpenCV avec Java + Tomcat
J'ai essayé d'utiliser Gson
J'ai essayé d'utiliser TestNG
J'ai essayé d'utiliser Galasa
À partir de Swift Swift UI
[Android] J'ai quitté SQLite et essayé d'utiliser Realm
J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)
J'ai essayé DI avec Ruby
J'ai essayé d'utiliser azure cloud-init
J'ai essayé d'utiliser Apache Wicket
J'ai essayé d'utiliser Java REPL
J'ai essayé UPSERT avec PostgreSQL.
J'ai essayé BIND avec Docker
[Swift] J'ai essayé d'implémenter une interface utilisateur semblable à un profil Instagram avec UICollectionView avec juste du code sans storyboard
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
J'ai essayé d'utiliser la bibliothèque CameraX avec Android Java Fragment
J'ai essayé d'utiliser anakia + Jing maintenant
J'ai essayé d'utiliser Spring + Mybatis + DbUnit
J'ai essayé l'analyse morphologique avec MeCab
J'ai essayé d'interagir avec Java
J'ai essayé la communication UDP avec Java
J'ai essayé d'utiliser l'API Java8 Stream
J'ai essayé d'utiliser JWT en Java
J'ai essayé GraphQL avec Spring Boot
[Android] J'ai essayé d'utiliser la disposition du coordinateur.
J'ai essayé Flyway avec Spring Boot
J'ai essayé d'utiliser le conteneur Pari gp
J'ai essayé d'utiliser WebAssembly Stadio (version 2018/4/17)
J'ai essayé de personnaliser Slim avec Scaffold
J'ai essayé d'utiliser le mémo Java LocalDate
J'ai essayé d'utiliser Google HttpClient de Java
J'ai essayé de me connecter à MySQL en utilisant le modèle JDBC avec Spring MVC
[Swift] J'ai essayé d'utiliser ColorPicker (celui qui peut facilement sélectionner la couleur) ajouté dans iOS14 [SwiftUI]
J'ai essayé d'utiliser l'API Elasticsearch en Java
Personnaliser la vue avec le modificateur de vue dans l'interface utilisateur Swift
J'ai essayé d'utiliser l'outil de diagnostic Java Arthas
J'ai essayé d'utiliser UICollectionViewListCell ajouté à partir de Xcode12.
J'ai essayé de démarrer avec Web Assembly
J'ai essayé l'apprentissage de la gestion qui fait gagner du temps avec Studyplus.
C'est nouveau, mais j'ai essayé d'utiliser Groonga
J'ai essayé de jouer un peu avec BottomNavigationView ①
J'ai essayé l'initialisation paresseuse avec Spring Boot 2.2.0
J'ai créé et défini mon propre dialecte avec Thymeleaf et j'ai essayé de l'utiliser
[iOS] J'ai essayé de créer une application de traitement de type insta avec Swift
Swift UI 100 coups
[Pour les débutants] J'ai essayé d'utiliser DBUnit avec Eclipse
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
J'ai essayé de gérer la configuration des jambes de force avec Coggle
[Pour les débutants] J'ai essayé d'utiliser JUnit 5 avec Eclipse
J'ai essayé de gérer les informations de connexion avec JMX