적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift 튜토리얼

[Swift iOS] Core Data 이용한 ToDoList 예제

hongssup_ 2021. 6. 12. 09:48
반응형

Core Data 사용 방식이 다양해서 아주 기초적인 방식으로 간단한 데이터 저장을 구현해보기 위해 심플한 튜토리얼을 따라해보았다.

 

프로젝트 생성할 때, Use CoreData를 체크해서 생성하면 자동으로 코어데이터 파일과 AppDelegate에 CoreData 관련 코드가 자동으로 함께 생성이 된다.  

데이터를 영구적으로 저장해둘 저장소 persistentContainer

// MARK: - Core Data stack
lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "ToDoList")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

데이터 저장을 도와주는 saveContext 메서드

// MARK: - Core Data Saving support
func saveContext () {
    let context = persistentContainer.viewContext
    if context.hasChanges {
        do {
            try context.save()
        } catch {
            let nserror = error as NSError
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }
}

생성된 ToDoList.xcdatamodel 파일에서 Entity(ToDoListItem)를 추가해주고 Attributes에 프로퍼티들을 추가해준다. 

 

.xcdatamodel - Editor - Create NSManagedModel subclass 

해주면 자동으로 NSManagedObject 프로토콜 속성을 상속받은 ToDoListItem 클래스와 fetchRequest 메서드가 생성된다. 

 

그런다음 ViewController에서 CRUD 메서드들을 만들어주면 원하는 사용할 수 있다. 

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
private var models = [ToDoListItem]()

// MARK: - Core Data

func getAllItems() {
    do {
        models = try context.fetch(ToDoListItem.fetchRequest())
        
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
    catch {
        // error
    }
}

func createItem(name: String) {
    let newItem = ToDoListItem(context: context)
    newItem.name = name
    newItem.createdAt = Date()
    
    do {
        try context.save()
        getAllItems()
    }
    catch {
        
    }
}

func deleteItem(item: ToDoListItem) {
    context.delete(item)
    
    do {
        try context.save()
        getAllItems()
    }
    catch {
        
    }
}

func updateItem(item: ToDoListItem, newName: String) {
    item.name = newName
    
    do {
        try context.save()
        getAllItems()
    }
    catch {
        
    }
}

 

 

 

참고 : https://www.youtube.com/watch?v=rjHBINtpKA8 

 

728x90
반응형

'Swift iOS 앱 개발 > Swift 튜토리얼' 카테고리의 다른 글

RxSwift 곰튀김  (0) 2022.10.11
[Swift iOS] Face Detection  (0) 2021.12.22
[Stanford iOS] Lecture 12. Core Data  (0) 2021.04.13
[Stanford iOS] Lecture 9. Data Flow  (0) 2021.04.12
[Stanford iOS] Lecture 8. Gestures JSON  (0) 2021.04.12