영구 데이터를 저장하고, 임시 데이터를 캐시하고, 단일 장치에서 앱에 실행 취소 기능을 추가합니다.
Core Data는 개체를 저장소에 매핑하는 세부 정보를 추상화하여 데이터베이스를 직접 관리하지 않고도 Swift 및 Objective-C에서 데이터를 쉽게 저장할 수 있도록 합니다.
NSPersistentContainer는 관리 개체 모델(NSManagedObjectModel), 영구 저장소 조정자(NSPersistentStoreCoordinator) 및 관리 개체 컨텍스트(NSManagedObjectContext)를 통해 코어 데이터 스택의 생성 및 관리를 단순화합니다.
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?
지정된 관리 개체 컨텍스트의 영구 저장소 코디네이터와 연결된 관리 개체 모델에서 지정된 이름을 가진 엔터티를 반환합니다.
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
}()
lazy var context: NSManagedObjectContext = persistentContainer.viewContext
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("저장 실패")
}
}
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
}
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("수정 실패")
}
}
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("삭제 실패")
}
}