-
210426 - TILTIL/2021 2021. 4. 28. 01:20
CoreData
서버에서 데이터를 가져오면 이 데이터를 CoreData에 저장해서 간단한 작업들은 다음에 네트워크 요청을 하지 않고 이 데이터를 이용하여 처리하기 위해서 CoreData 공부를 해야 했다.
전에는 어렵다고 느꼈는데 다시 공부해보니.... 쉽게 느껴졌다.
CoreData
- 데이터를 저장하고 출력하는 기능을 쉽게 구현 가능!
- Persistent Cotainer: NSPersistentContainer
- 4가지 중요 객체 - CoreDataStack
- Persistent Store: NSPersistentStore
- 영구 저장소
- Object Model: NSManagedObjectModel
- 데이터들의 관계, 어떤 데이터가 들어가는지
- Persistent Store Coordinator: NSPesistentStoreCoordinator
- 영구저장소의 데이터를 가져오거나 저장하는 객체
- Managed Object Context: NSManagedObjectContext
- CoreData를 통해 실행하는 작업을 담당
- 임시 데이터로 다루고 복사본을 가져온다.
- 꼭 저장을 해야 영구저장소에 저장이 된다.
- 사용해보기
- 프로젝트 시작할 때 Use Core Data를 체크하면 CoreDataStack 초기화와 DataModel이 자동적으로 생성된다.
- 만약 기존 프로젝트에 추가를 시키는 거라면 CoredataModel을 추가해야 한다.
- 그리고 container 초기화를 직접 해야 한다.
CRUD
- 그전에 자주 사용하게 되는 context를 속성으로 선언하자
- persistentContainer.viewContext를 가져오면 된다.
- Create
- Entity를 생성하는 방법은 다양하다.
- NSEntityDiscription이 제공하는 메서드로 생성해보기
- 이걸 이용하면 타입이 NSManagedObject이기 때문에 속성에 바로 접근이 불가능하다.
- setValue로 key value를 저장해야 한다.
- 주의할 점은 value의 형식이 Any이기 때문에 잘못된 타입이 들어가면 crash가 난다.
- Read
- Read 할 때는 fetchRequest를 보내야 한다.
- NSFetchRequest<T> 으로 되어 있다.
- 데이터를 가져오면 배열로 return 해준다.
- 데이터가 없다면 빈 배열이 return
- value(forKey:)로 값을 가져오는데 Any이기 때문에 typecasting을 해줘야 한다.
- Update
- Create와 다를 게 없지만 무엇을 수정해야 할지 target이 필요하다.
- target만 정한다면 create와 같은데 수정한 후에 꼭 context를 저장하도록 하자.
- Delete
- target을 정하고 context의 delete(_:)를 호출하고 저장해주면 된다
Managed Object
- Coredata가 lifecycle을 관리한다.
- Managed Object를 subclassing한 Entity class를 사용하면 속성을 이용할 수 있다.
- 이전에 사용한 거에서 crash가 발생한 것을 기억하자
Managed Object Context
- Managed Object는 context내부에 존재하게 된다.
- Persistent Store에 바로 저장되지 않고 context에 먼저 임시 저장된다.
Entity
- Entity는 UpperCamleCase로 이름을 지어준다.
- Class의 name은 entity와 연결되는 class의 이름이다.
- 구별을 쉽게 하기 위해 주로 뒤에 entity를 붙여준다.
- Class definition으로 하면 entity class가 자동으로 생성된다.
- 만약 EntityClass를 직접 생성했다면 컴파일 오류가 발생한다.
- 이 기능은 별도의 기능을 추가하지 않을 때 사용하게 된다.
- 직접 만들고 싶다면 Manual/None을 선택하면 된다.
- 쉽게 만들고 싶다면 Editor -> Create NSManagedObjectSubclass를 선택
- 그럼 두 개의 파일이 생성된다. Class, Extension
- Extension은 entity를 새로 업데이트하면 초기화된다.
- Class는 유지된다.
- 여기서 별도의 기능을 추가하는 것이다.
- Category/Extension
- Extension을 자동으로 생성해주고 Class선언은 우리가 생성해야 한다..
Attribute
- Attribute는 lowerCamelCase
- Transient는 영구저장소에 저장되지 않는다.
- Optional을 빼면 필수항목이 되고 비어있다면 저장할 때 오류가 발생하고 저장되지 않는다.
DataManager
- 기본으로 생성되는 코드는 Appdelegate에 들어가 있어서 매번 접근해서 사용하는 게 비효율적이다.
- 그래서 DataManager 객체를 하나 만들자.
- Container를 초기화하고 context를 만들어주자.
- 그리고 saveContext 메서드를 만들자.
- context.perform 메서드는 context의 thread에서 코드를 실행한다.
- 하나의 DataModel을 사용하면 대체적으로 Datastack을 앱 시작시에 초기화하고
- 특정 Scene에만 필요한 Model이 있다면 Scene시작에 초기화한다
- 앱 시작시에는 Appdelegate의 didFinishLaunchingWithOptions에서 초기화를 실행한다.
새로운 CRUD
- Create
- NSManagedObject를 이용하여 Entity를 생성한다.
- 생성자에 (context:)만 가진 게 있는데 subclass 되어있는 객체만 생성 가능하다.
- 즉 NSManagedObject()가 아니라 PersonEntity()와 같이 사용해야 한다.
- 이전과 같이 keyValue인 setValue가 아니라 속성으로 바로 저장할 수 있다.
- Read
- [Entity] 배열을 return 하도록 구현한다.
- 그리고 context.perform이 아닌 performAndWait를 사용한다.
- block을 모두 실행할 때까지 return하지 않는다.
- 가져올 때 정렬은 다음에 공부하고 일단 가져오기만 하자
- sortDescriptor를 사용할 거다.
- 이전과 똑같이 fetch를 호출하고 list에 저장하자
- performAndWait에서 구현했기 때문에 list가 채워지고 다음 코드가 실행된다.
- 그리고 list를 return 하자.
- Update
- 역시 target이 필요하다.
- target을 파라미터로 주면 간단!
- Delete
- 마찬가지로 target을 파라미터로 전달!
- KeyValue가 아니어서 안전하다.
- 간단하게 Entity instance를 만들수 있다.
CoreData를 이용한 간단한 앱 만들어보기
공부한 CoreData를 익히기 위해서 간단한 App을 만들었다.
ProductDataModel을 만들고 ProductEntityClass를 이용해 CRUD를 구현했다.
coredata를 이용한 앱 728x90'TIL > 2021' 카테고리의 다른 글
210429 - TIL (0) 2021.04.30 210427 - TIL (0) 2021.04.28 210425 - TIL (0) 2021.04.26 210422 - TIL (0) 2021.04.23 210421 - TIL (0) 2021.04.22