1. DataModel로 이동해서 entity생성
entit는 Class와 거의 동일 (= 테이블과도 개념이 비슷해서 엑셀 단일 시트와 같이 단일 entity를 가진다)
Attributes는 Properties와 동일
2. 이름 바꾸기
3. Attributes(속성 추가하기)
4. 모듈 바꾸기
Global namespace에서 Current Product Module로 바꾼다.
(코어데이터 프로젝트가 많아지고, 멀티 스레딩이 필요하면 오류가 발생할 수도 있기 때문)
**Codegen이란?
1. Mnual/None -> 모든 작업을 직접 수행해야함
2. Class Definition (Default) -> data, entity, property를 class와 property로 만들어 사용하고 조작 가능하
3. Category/Extension -> 나만의 커스텀 설정 -> entity와 이름이 동일한 클래스를 생성하면 xcode가 자동으로 링크한다.
AppDelegate Coredata 살펴보기
// MARK: - Core Data stack
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
lazy란 사용하려고 할 때만 값이 로드되는 변수
메모리에서 이득을 본다 (다른 변수들은 메모리를 미리 잡아놓는데, 얘는 필요할 때만 잡기 때문)
NSPersistentContainer는 사실 SQLite데이터베이스인데 PersistenteContainer라고 불리는 이유는 다른 타입을 사용할 수 있기 때문이다.
그 이후 load하고, 에러 나오면 에러 출력
// 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)")
}
}
}
프로그램이 종료될 때 데이터를 저장하는 메서드
context는 데이터를 변경하고, 업데이트할 수 있는 영역이므로
영구적인 저장을 위한 container의 임시영역으로 볼 수 있다.
5. Viewcontroller에서 coredata 가져오기
import CoreData
6. Coredata object를 initialize하기
coredata에 저장한 property를 가져오기 위해서
entity 이름으로 객체를 만들기 위해 initialize하고 괄호를열면 context가 나오는데 이것은 AppDelegate의 persistent container의 viewcontext이다.
let newItem = Item(context: self.context)
앱과 DB사이에 data를 왔다갔다 하기 위해서는 context를 잘 이해해야한다.
AppDelegate에 context를 살펴보면
간략하게 말하면 context는 임시영역의 역할을 한다(data를 가둬두고 create, read, update, delete할 수 있는..)
이 coredata에 있는 context를 app으로 가져오기 위해서는
동일한 class내부에 있으니 persistentContainer의 변수에 쉽게 액세스 가능하지만
Appdelegate와 Viewcontroller는 다른 클래스이기 때문에 Appdelegate class를 호출해야하는데,
호출하는 방법
UIApplication.shared.delegate를 Appdelegate로 다운캐스트 한다
좀 더 상세하게 바라보면
UIApplication.shared-> 얘는 앱이 실행되는 시점에서 공유된다. / singleton개체를 object로 가져올 애
UIApplication.shared.delegate -> 얘는 app object의 delegate
이것을 AppDelegate로 다운캐스트 / 동일한 superclass에서 상속하기 떄문에 다운 캐스트 가능하다
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
데이터를 저장하기위해 context가 또 사용되므로 전역변수 처리를 해주도록 하자
7. 데이터 저장하기 (Create)
(a) Viewcontroller에 saveItem 메서드를 가지고 있다면, viewcontroller에서 궁극적으로 context를 저장소에 commit해야한다는 것
commit을 하기 위해서는
appdelegate의 context.save()를 호출해야한다.
(b) 그렇게 하기 위해서는 context.save를 Viewcontroller의 saveItem메서드에서 호출해야 한다는 것
이렇기 떄문에 context를 위에서 전역변수 처리해버렸다.
func saveItems() {
do {
try context.save()
} catch {
print("Error saving context \(error)")
}
self.tableView.reloadData()
}
결론적으로 앱과 DB는 서로 직접적으로 다가갈 수 없기때문에
임시영역을 통해서만 Data를 주고 받을 수 있다는 것.. (마치 Git의 staging area처럼..)
그 임시영역의 이름이 context..
여기까지가 데이터베이스 CRUD의 C(Create) 작업이고
너무 길어지기 때문에
RUD(Read, Update, Delete)는 다음 피드에......
'iOS > Swift 어플 따라하기' 카테고리의 다른 글
[Swift] Query using Coredata (Searchbar) (0) | 2022.10.17 |
---|---|
[Swift] Coredata로 CRUD (0) | 2022.10.14 |
[Swift] 프로젝트 중 CoreData 추가하기 (0) | 2022.10.11 |
[Swift] NSCoder로 Data decode (0) | 2022.10.11 |
[Swift] NScoder로 data Encode (0) | 2022.10.06 |