SwiftUI

SwiftUI와 Database 붙이기

Lcoding 2023. 11. 9. 15:04
반응형

1. SwiftUI에서 CoreData를 사용하는법.

SwiftUI에서 CoreData로 DB를 사용할 경우 아래와 같이 CoreDataManager로 CRUD를 만든후 
@main 앱에  
    let manager = CoreDataManager.shared

                MainListView()
                    .environment(\.managedObjectContext, manager.mainContext)
                    .environmentObject(manager)}

이렇게 선언하여 사용한다.

//  CoreDataManager.swift
//  swiftUiMemo
//

import Foundation
import CoreData
import SwiftUI

class CoreDataManager: ObservableObject {
    static let shared = CoreDataManager()
    
    let container: NSPersistentContainer
    
    var mainContext: NSManagedObjectContext {
        return container.viewContext
    }

    init(inMemory: Bool = false) {
        container = NSPersistentContainer(name: "swiftUiMemo")
        if inMemory {
            container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
        }
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        container.viewContext.automaticallyMergesChangesFromParent = true
    }

    
    func saveContext() {
    
    }
    
    func addMemo(content: String) {

    }
    
    
    func update(memo: MemoEntity?, content: String) {

    }
    
    func delete(memo: MemoEntity?) {
     
    }
}



2. SwiftUI에서 Firebase를 사용하는법.

@main 앱에  
   @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
이렇게 선언하고 @main 구조체 상단에


import SwiftUI
import FirebaseCore
import FirebaseFirestore
import FirebaseAuth


class AppDelegate: NSObject, UIApplicationDelegate {
  func application(_ application: UIApplication,
                   didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
    FirebaseApp.configure()

    return true
  }
}

이렇게 Firebase를 선언한다.

SwiftUI에서 Firebase로 DB를 사용할 경우 아래와 같이 Firebase로 CRUD를 만든다.

import Foundation
import FirebaseDatabase
import FirebaseDatabaseSwift

class FMemoStore: ObservableObject {
    
    @Published var fmemos: [Fmemo] = []
    @Published var changeCount: Int = 0
    
    let ref: DatabaseReference? = Database.database().reference() // (1)
    
    private let encoder = JSONEncoder() // (2)
    private let decoder = JSONDecoder() // (2)
    
    func listenToRealtimeDatabase() {
        
        guard let databasePath = ref?.child("fmemos") else {
            return
        }
        
        databasePath
            .observe(.childAdded) { [weak self] snapshot, _ in
                guard
                    let self = self,
                    let json = snapshot.value as? [String: Any]
                else {
                    return
                }
                do {
                    let memoData = try JSONSerialization.data(withJSONObject: json)
                    let memo = try self.decoder.decode(Fmemo.self, from: memoData)
                    self.fmemos.append(memo)
                } catch {
                    print("an error occurred", error)
                }
            }
        
        databasePath
            .observe(.childChanged){[weak self] snapshot, _ in
                guard
                    let self = self,
                    let json = snapshot.value as? [String: Any]
                else{
                    return
                }
                do{
                    let memoData = try JSONSerialization.data(withJSONObject: json)
                    let memo = try self.decoder.decode(Fmemo.self, from: memoData)
                    
                    var index = 0
                    for memoItem in self.fmemos {
                        if (memo.id == memoItem.id){
                            break
                        }else{
                            index += 1
                        }
                    }
                    self.fmemos[index] = memo
                } catch{
                    print("an error occurred", error)
                }
            }
        
        databasePath
            .observe(.childRemoved){[weak self] snapshot in
                guard
                    let self = self,
                    let json = snapshot.value as? [String: Any]
                else{
                    return
                }
                do{
                    let memoData = try JSONSerialization.data(withJSONObject: json)
                    let memo = try self.decoder.decode(Fmemo.self, from: memoData)
                    for (index, memoItem) in self.fmemos.enumerated() where memo.id == memoItem.id {
                        self.fmemos.remove(at: index)
                    }
                } catch{
                    print("an error occurred", error)
                }
            }
        
        databasePath
            .observe(.value){[weak self] snapshot in
                guard
                    let self = self
                else {
                    return
                }
                self.changeCount += 1
            }
    }

    func stopListening() {

    }

    func addNewFmemo(memo: Fmemo) {

    }

    func deleteFmemo(key: String) {

    }
    
    func deleteIndex(set: IndexSet) {

    }
    
    func editFmemo(memo: Fmemo) {
       
    }
    
}

반응형