SwiftUI와 Database 붙이기
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) {
}
}