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.
Swift 5.3 Xcode 12.0.1 Cocoapods 1.9.3 RealmSwift 5.4.7
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.
・ 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
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
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.
Merci d'avoir lu jusqu'au bout. J'espère que cela aidera les personnes qui utilisent Swift UI et Realm.
Recommended Posts