Core Data, CRUD

Groot·2022년 8월 24일
0

TIL

목록 보기
56/148
post-thumbnail

TIL

🌱 난 오늘 무엇을 공부했을까?

📌 Core Data - 공식문서

  • Core Data를 사용하여 오프라인 사용을 위해 애플리케이션의 영구 데이터를 저장하고, 임시 데이터를 캐시하고, 단일 장치에서 앱에 실행 취소 기능을 추가합니다.
  • Core Data는 개체를 저장소에 매핑하는 세부 정보를 추상화하여 데이터베이스를 직접 관리하지 않고도 Swift 및 Objective-C에서 데이터를 쉽게 저장할 수 있도록 합니다.

📍 NSPersistentContainer

  • app의 Core Data stack을 캡슐화하는 컨테이너입니다.
  • NSPersistentContainer는 관리 개체 모델(NSManagedObjectModel), 영구 저장소 조정자(NSPersistentStoreCoordinator) 및 관리 개체 컨텍스트(NSManagedObjectContext)를 통해 코어 데이터 스택의 생성 및 관리를 단순화합니다.

🔗 Managing Persistent Stores

var viewContext: NSManagedObjectContext 

메인 큐의 관리 객체 컨텍스트.

📍 NSManagedObjectModel

  • 개체를 설명하는 .xcdatamodeld 파일의 프로그래밍 방식 표현입니다.
  • 관리 개체 모델은 각 엔터티 개체와 해당 관리 개체 클래스 간의 매핑을 유지 관리하여 Core Data 프레임워크의 영구 저장 메커니즘과 함께 사용합니다.
  • 메서드를 사용하여 특정 관리 개체에 대한 엔터티를 결정할 수 있습니다.

📍 NSPersistentStoreCoordinator

  • 모델을 사용하여 컨텍스트와 영구 저장소가 통신하는 데 도움이 되는 조정자입니다.
  • NSManagedObjectContext의 인스턴스는 코디네이터를 사용하여 개체 그래프를 영구 저장소에 저장하고 모델 정보를 검색합니다.
  • 코디네이터가 없는 컨텍스트는 코디네이터를 통하지 않고는 모델에 액세스할 수 없으므로 완전히 작동하지 않습니다.

📍 NSManagedObjectContext

  • 관리 대상 개체에 대한 변경 사항을 조작하고 추적하기 위한 개체 공간입니다.
  • 컨텍스트는 수명 주기 관리(오류 포함)에서 유효성 검사, 역 관계 처리 및 실행 취소/다시 실행에 이르기까지 책임이 있는 관리 개체의 수명 주기에서 중심 역할을 하는 강력한 개체입니다.
  • CRUD 담당

📍 NSManagedObject

  • Core Data 모델 개체에 대한 동작을 구현하는 기본 클래스입니다.
init(entity: NSEntityDescription, insertInto: NSManagedObjectContext?)

엔터티 설명에서 관리되는 개체를 초기화하고 지정된 관리되는 개체 컨텍스트에 삽입합니다.

📍 NSEntityDescription

  • Core Data의 엔터티에 대한 설명입니다.

🦎 Retrieving a description by its name

class func entity(forEntityName: String, in: NSManagedObjectContext) -> NSEntityDescription?

지정된 관리 개체 컨텍스트의 영구 저장소 코디네이터와 연결된 관리 개체 모델에서 지정된 이름을 가진 엔터티를 반환합니다.

📍 구현

  • NSPersistentContainer 초기화
lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "JokeDataModel")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()
  • NSManagedObjectContext 초기화
 lazy var context: NSManagedObjectContext = persistentContainer.viewContext
  • Create
func save(joke: String, category: Category, id: UUID) {
        guard let entity = NSEntityDescription.entity(forEntityName: "Joke", in: context)
        else { return }
        
            let managerObject = NSManagedObject(entity: entity, insertInto: context)
            managerObject.setValue(joke, forKey: "body")
            managerObject.setValue(category.rawValue, forKey: "category")
            managerObject.setValue(id, forKey: "id")
            
            do {
                try context.save()
            } catch {
                print("저장 실패")
            }
    }
  • Read
func fatch() -> [Model] {
        var models = [Model]()
        do {
            let jokes = try context.fetch(Joke.fetchRequest()) as? [Joke]

            jokes?.forEach {
                models.append(Model(content: $0.body,
                                    category: Category(rawValue: $0.category) ?? .아재개그,
                                    id: $0.id))
            }
        } catch {
            print("조회 실패")
        }
        
        return models
    }
  • Updata
func update(body: String, id: UUID) {
        guard let jokes = try? context.fetch(Joke.fetchRequest()) as? [Joke] else { return }
        
        jokes.filter { $0.id == id }.forEach { $0.setValue(body, forKey: "body") }
        
        do {
            try context.save()
        } catch {
            print("수정 실패")
        }
    }
  • Delete
func delete(id: UUID) {
        guard let jokes = try? context.fetch(Joke.fetchRequest()) as? [Joke] else { return }
        
        jokes.filter { $0.id == id }.forEach { context.delete($0) }
        
        do {
            try context.save()
        } catch {
            print("삭제 실패")
        }
    }
profile
I Am Groot

0개의 댓글