이전글 [MacOS] 코어데이타 스토리보드 바인딩 예제 에서 코드한줄 없이 코어데이타를 구현해보았습니다. 이번에는 코드를 사용해서 코어데이타를 구현해 볼것입니다.
✅ MacOS 앱 개발로 예제를 진행합니다.
1. 코어데이타 프로젝트 시작하기
Xcode 앱을 실행
➀ 메뉴 → File
➁ New
➂ Project...
➀ macOS
➁ App
➂ Next
➀ 프로젝트 이름 : CoreDataText
➁ Storyboard
➂ Swift
➃ Core Data 체크
➄ Next
프로젝트를 생성하고 나면 기본 프로젝트구성에 AppDelegate 코어데이타 코드와 CoreDataTest 모델 파일이 생성됩니다. AppDelegate 에 persistentContainer 와 saveAction 등의 코어데이타 코드가 추가되어 있습니다.
2. 코어데이타 모델
코어데이타 모델파일은 데이타베이스에서 스키마와 같습니다. 다른 데이타베이스와 비슷하게 테이블을 생성하고 관리할 수 있습니다. 데이타베이스에서 테이블이 코어데이타에서는 엔티티(Entity)로 네이밍되고 있습니다.
➀ CoreDataTest
➁ Add Entity
➂ Entity
➀ Entity → Person 이름 변경 (더블클릭)
➁ + 속성 추가
➂ age (Integer16), name (String) 2개 속성 추가
3. 데이타 추가 • 조회 • 삭제
간단한 테스트를 위해서 UI를 사용하지 않고 바로 코드를 구현하는 방식으로 예제를 진행하겠습니다.
데이타 추가하기
let managedContext = self.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "Person", in: managedContext)!
let record = NSManagedObject(entity: entity, insertInto: managedContext)
record.setValue("jh", forKey: "name")
record.setValue(18, forKey: "age")
// 데이타 저장
try! managedContext.save()
➀ AppDelegate
➁ applicationDidFinishLauncing 메서드에 코드 추가
아직은 실행해도 데이타가 추가되었는지 확인할 수 없습니다. 다음단계 데이타 조회하기에서 추가된 데이타를 확인합니다. 데이타를 저장하는 코드때문에 앱을 실행할때마다 데이타가 저장되게 됩니다.
데이타 조회하기
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Person")
let persons = try! managedContext.fetch(fetchRequest)
let name = persons[0].value(forKey: "name") as! String
let age = persons[0].value(forKey: "age") as! Int
print(name, age)
➀ 이전코드에 위 코드 추가
➁ Run 실행
➂ 추가된 데이타 출력 확인
추가된 데이타가 persons 에 배열로 리턴됩니다. 로그를 통해 데이타 속성인 name 과 age 값을 확인할 수 있습니다.
데이타 삭제하기
// 삭제전 데이타 개수
print(persons.count)
managedContext.delete(persons[0])
let persons2 = try managedContext.fetch(fetchRequest)
// 삭제후 데이타 개수
print(persons2.count)
➀ 이전코드에 위 코드 추가
➁ Run 실행
➂ 추가된 데이타 출력 확인
delete 메서드로 간단하게 데이타를 삭제할 수 있습니다. 배열로 리턴된 persons 첫번째 항목을 삭제합니다. 삭제 이전과 후로 변경된 데이타 개수로 삭제된것을 확인합니다.
4. 엔티티 타입 사용하기
- Codegen 속성 Manual/None 설정
- NSManagedObject 서브클래스를 추가
➀ CoreDataTest
➁ Person
➂ Manual/None
➀ 메뉴 → Editor
➁ Create NSManagedObject Subclass...
➀ CoreDataTest 선택
➁ Next
➀ Person 선택
➁ Next
➀ Create
➀ 파일생성 확인
// 데이타 추가
let managedContext = self.persistentContainer.viewContext
let person = Person(context: managedContext)
person.name = "jh"
person.age = 18
// 데이타 조회
let persons = try! managedContext.fetch(Person.fetchRequest())
let name = persons[0].name!
let age = persons[0].age
print(name, age)
print(persons.count)
// 데이타 삭제
managedContext.delete(persons[0])
// 데이타 조회
let persons2 = try! managedContext.fetch(Person.fetchRequest())
print(persons2.count)
➀ AppDelegate
➁ applicationDidFinishLauncing 메서드 기존코드 제거
➂ 위 코드 추가
➀ Run 실행
명시된 타입을 사용해서 이전보다 간결한 코드작성이 가능합니다.
댓글