티스토리 뷰

CoreData를 사용하기 위해서는 프로젝트 생성시에 Use Core Data를 체크하면 되지만

프로젝트 중간에 CoreData를 추가하게 되었다

 

프로젝트 중간에 CoreData 추가하기

Data Model 파일 생성하기

[command + N] 또는 [File] - [New] - [File...] 으로 Core Data의 Data Model 파일을 만들어준다

 

.xcdatamodeld 확장자의 파일이 생긴 것을 확인할 수 있다

 

AppDelegate 수정하기

AppDelegate를 그 다음으로 수정해주어야 한다

CoreData를 import해주고,

import CoreData

 

 

    // MARK: UISceneSession Lifecycle

메서드들 다음에 아래 코드들을 추가해주자

    // MARK: - Core Data stack

    lazy var persistentContainer: NSPersistentContainer = {
        /*
         The persistent container for the application. This implementation
         creates and returns a container, having loaded the store for the
         application to it. This property is optional since there are legitimate
         error conditions that could cause the creation of the store to fail.
        */
        let container = NSPersistentContainer(name: "TestModel")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                 
                /*
                 Typical reasons for an error here include:
                 * The parent directory does not exist, cannot be created, or disallows writing.
                 * The persistent store is not accessible, due to permissions or data protection when the device is locked.
                 * The device is out of space.
                 * The store could not be migrated to the current model version.
                 Check the error message to determine what the actual problem was.
                 */
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    // MARK: - Core Data Saving support

    func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }

위 코드는 새로운 프로젝트를 생성해서 Use Core Data를 체크했을 때 나오는 AppDelegate의 코드들과 같다

 

중간에

        let container = NSPersistentContainer(name: "TestModel")

위와 같은 코드가 있는데, "TestModel" 대신에 아까 생성한 DataModel 파일의 이름으로 바꿔서 일치시켜주어야 한다

 

 

Entity 만들기

본격적으로 CoreData를 사용하기 위해서 Entity를 만들어보자

근데 Entity가 뭔데?

Entity

  • CoreData의 데이터 구성요소 중 하나
  • 데이터베이스 테이블과 유사한 개념
  • 데이터 모델 내에서 객체 또는 데이터 유형(Type)을 나타내며, 속성(Attribute)과 관계(Relationship)을 갖음
  • 앱에서 유일한 이름을 갖음
  • Entity와 속성들은 앱에서 저장된 데이터의 스키마 역할을 함
  • Core Data Stack 내에서 관리되며, 앱이 실행될 때 인스턴스화 됨
    (Core Data Stack에 대한 건 다음 포스팅에서)
  • 인스턴스화 된 이후에 객체를 생성하고 속성 값을 설정하면 해당 객체는 Context에서 관리되고 변경사항을 추적하고 저장소에 저장됨
    (Context도 다음 포스팅)

예를 들어 "자동차"라는 Entity를 생성하고, 자동차라는 Entity에 "브랜드", "가격", "색상" 등의 속성을 가질 수 있다

"자동차" Entity와 "오너" Entity 사이의 관계를 설정할 수도 있다

이러한 속성과 관계를 통해서 데이터 모델을 구성하고, 저장하고 검색하는 데 사용할 수 있다

하단의 Add Entity를 사용해서 Entity 생성!

 

Entity의 이름을 Car로 설정해주고, color, brand, price라는 속성(Attribute)을 설정했다

색상과 브랜드의 타입은 String으로, 가격의 타입은 숫자로 설정

 

과거에는 Editor Style을 변경해서 다이어그램 편집기로 볼 수 있었는데, Xcode 14 beta 3부터 removed 됐다..

 

Codegen

인스펙터에서 Codegen - Class Definition을 확인할 수 있다

Class Definition

Core Data는 Entity로부터 서브 클래스들을 자동으로 만들어준다

자세한 내용은 https://developer.apple.com/documentation/coredata/modeling_data/generating_code

생성된 소스 코드가 보이지는 않지만, 자동으로 생성된 프로퍼티나 메서드를 편집할 필요가 없는 경우 Class Definition을 사용하면 된다

 

Category/Extension 이나 Manual/None 옵션은 수동으로 편집을 하기 위한 옵션이라고 생각하면 된다

 

일단은 Class Definition으로 설정하고 진행할 예정이다

 

 

참고

https://developer.apple.com/documentation/coredata/creating_a_core_data_model

https://developer.apple.com/documentation/coredata/setting_up_a_core_data_stack

https://zeddios.tistory.com/987





댓글