해당 강의에서는 초기에 이미 CoreData를 체크하고 생성하여 바로 진행되었지만 나는 빼먹은 관계로..^^ 직접 추가했다.
// 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: "MemoApp")
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)")
}
}
}
content: String
, insertData: Date
를 추가한다.이제 content와 insertData는 Memo로 묶여 DB에 저장된다.
목록의 엔티티를 선택 후 우측의 창을 표시하면 된다.
여기에서 엔티티와 관련된 옵션을 설정할 수 있다.
Codegen
Class
-Name
의 내용과 같다.현재 상태에서 빌드하게 되면 예전에 만들었던 Memo 클래스와 현재 DataModel에서 생성된 Memo 클래스가 충돌하게 된다.
현재는 dummyMemoList에 접근하는 코드가 많기 때문에 후에 수정해주고
일단 AppDelegate에 추가했던 CoreData와 관련된 코드를 수정해줄 것이다.
do-catch
블록을 사용해야 함이후 dummyData에 접근하는 부분들 수정
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//tableView.reloadData()
//print(#function)
DataManager.shared.fetchMemo() //데이터로부터 메모 배열이 채워짐
tableView.reloadData() //배열에 저장된 테이블을 기준으로 뷰 업데이트
}
DataManager.swift에 메소드 추가
saveContext()
가 자동으로 지원여기서는 ComposeViewController에 위치
그러나 메모를 표시하는 데이터의 기준인 memoList가 별도로 갱신되지 않았기 때문에, 앱을 재시동 하지 않는 한 테이블뷰에 바로 적용되지 않는다.
메모가 정상적으로 추가됨을 확인