본문 바로가기

이전 블로그 글

220618 TIL [CoreData 사용 방법 - 2(프로젝트 생성 후 설정, 싱글톤)] (블로그 이전 포스팅)

원문 링크

위와 같은 뷰를 구성해서 텍스트 필드에 문자 입력 후 `코어 데이터에 저장` 버튼을 누르면 코어데이터에 저장하고 `저장된 정보들 프린트` 를 하면 말 그대로 저장되어있는 정보들을 프린트 할 예정이다

1. 프로젝트 생성

코어데이터 체크박스 해제 후 프로젝트 생성

 

2. Data Model파일 생성 및 기본 세팅 (기본 세팅은 이전 게시글 참조)

3. CoreData를 관리할 객체 생성

import Foundation
import CoreData

class CoreDataManager {
    //싱글톤 생성
    static let shared = CoreDataManager()
    
    //이전 게시물에는 AppDelegate에 생성되어있던 persistentContainer를 이곳에 생성
    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "Model")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()
    
    //NSManagedObjectContext가져오기 (위에 만들어진 persistentContainer의 context반환)
    var context: NSManagedObjectContext {
        return persistentContainer.viewContext
    }
    
    //entity 가져오기 (forEntityName은 coredata model파일에서 만들어준 entity의 이름)
    var textEntity: NSEntityDescription? {
        return NSEntityDescription.entity(forEntityName: "Text", in: context)
    }
    
    //NSManagedObject 생성, 값 세팅 및 저장
    func saveTextValue(textModel: TextModel) {
        guard let textEntity = textEntity else {
            return
        }
        //생성
        let managedObject = NSManagedObject(entity: textEntity, insertInto: context)
        //값 세팅
        managedObject.setValue(textModel.text, forKey: "text")
        managedObject.setValue(textModel.textCount, forKey: "textCount")
        //저장
        do {
            try context.save()
        } catch {
            print(error.localizedDescription)
        }
    }
    
    func fetchData() -> [Text] {
        //코어데터에서 가져온 데이터를 저장할 빈 배열 생성
        var texts: [Text] = []
        //fetch를 통해 데이터 가져오기
        do {
            texts = try context.fetch(Text.fetchRequest()) as [Text]
        } catch {
            print(error.localizedDescription)
        }
        return texts
    }
}

4. 코어데이터를 사용할 곳에서 위 싱글톤 객체를 이용해 사용하기

class ViewController: UIViewController {
    @IBOutlet weak var myTextField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    //textField에서 저장할 데이터 가져오기
    func getText() -> TextModel? {
        guard let text = myTextField.text else {
            return nil
        }
        
        return TextModel(text: text, textCount: text.count)
    }
    
    //코어데이터에 위에서 반환되는 TextModel 저장하기
    @IBAction func touchSaveButton(_ sender: UIButton) {
        guard let textModel = getText() else {
            return
        }
        
        CoreDataManager.shared.saveTextValue(textModel: textModel)
    }
    
    //코어데이터에서 데이터 가져와서 프린트 하기
    @IBAction func touchPrintButton(_ sender: UIButton) {
        let texts = CoreDataManager.shared.fetchData()
        for (index, text) in texts.enumerated() {
            print("\(index)-----------------")
            print("text : \(text.text ?? "")")
            print("count : \(text.textCount)")
        }
    }
}

결과

참고자료
https://velog.io/@leeesangheee/Core-Data-%EC%82%AC%EC%9A%A9%ED%95%B4-CRUD-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0