관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 13. 코어 데이터(Core Data)의 개념(실습) - (3) 본문

iOS 실전 (swift)/데이터베이스

[iOS - swift] 13. 코어 데이터(Core Data)의 개념(실습) - (3)

jake-kim 2020. 5. 19. 18:45

* 기본개념은 링크 참고 ios-development.tistory.com/92

 

[iOS - swift] 12. 코어 데이터(Core Data)의 개념 - (2)

기초 개념은 다음 링크 참조 : 11. 코어 데이터(Core Data)의 개념 - (1) [iOS - swift] 12. 코어 데이터(Core Data)의 개념 - (1) * Core Data는 DataBase가 아님 ( Core Data는 ORM 매핑 프레임워크가 맞는 의미..

ios-development.tistory.com

1. 코어 데이터 추가(처음 프로젝트 생성시 "Core Data"체크)

2. Entity, Attributes, Relationships 정의

1) "Board", "Log" 엔터티와, Attributes, Relationship 각 정의

(1) Log엔터티 작성 (Class Name도 LogMO로 작성, Codegen을 "Class Definition"으로)

Log 엔터티화면

(2) Board엔터티 작성 (Class Name도 BoardMO로 작성, Codegen을 "Class Definition"으로)

board엔터티 화면

 

2) Relationships속성 정의

 (1) Log 엔터티 관점

- toOne : 하나의 로그는 하나의 게시글만 참고해야 하므로

- Delete Rule 속성 : Cascade (게시글이 삭제되면 이를 참조하는 로그도 같이 삭제되도록)

Log엔터티

(2) Board엔터티 관점

※ 주의사항 : 두 릴레이션은 서로 역참조관계(각 입장에서 상대방이 "나"를 참조하고 있는 형태)이므로 "Inverse"속성에 표시

(한쪽에서만 표시하면 자동으로 반대쪽도 설정됨)

서로 역참조 관계를 알림

- 하나의 게시글을 여러 로그가 참조할 수 있으므로 1:M (toMany)

- 참조되는 로그 레코드들은 참조가 등록된 순서대로 정렬되어 있어야 하므로 ordered 항목 체크

Board엔터티 입장에서의 Relationship속성 설정
결과

 

*실제 내부적으로 코드가 구현된 모습 확인 (LogMO, BoardMO), BoardMO는 toMany이므로 레코드를 추가하거나 삭제하는데 편리한 다양한 메소드 제공하는 모습 확인

3. CRUD를 실행해서 테이블 뷰에 표시할 ListVC.swift생성

 * 실제 프로그래밍을 할 땐 DAO클래스를 둬서 CRUD를 따로 저장할 것

 

1) fetch(read)와 데이터 표현

- import CoreData, 12라인

- 데이터 형을 NSManagedObject으로 표현, 14번라인

- 데이터를 읽을 땐 appDelegate에 있는 context를 참조, 20~23번라인

- request객체를 통해 영구 저장소에 접근하여 데이터 read, 28번라인

- 정렬기준 설정, 25~26번라인

- fetch를 통해 얻은 데이터는 .value로 데이터를 얻을 수 있으며, 타입은 NSManagedObject이므로 캐스팅 필요, 34~26번라인

2) save

- 저장에 이용할 관리 객체 생성 : 57번라인

- 관리 객체를 통한 저장 .satValue(_,forKey:), 57~60번라인

- 1:M관계인, board입장에서 로그정보들을 등록, 52~70번라인

- 영구 저장소와 컨텍스트와의 동기화 실패할 경우,

    마지막 동기화 시점 이후의 모든 변경 내역을 원래대로 되돌리는 역할인 rollback(), 78번라인

3) delete

- 컨텍스트객체를 불러와, 데이터를 삭제 한 후 영구 저장소에 이를 저장

- 실패시 rollback()

- table veiw에서 edit기능 사용시 DB와 동시에 테이블 행 삭제

 

4) update

- 수정할 NSManagedObejct를 파라미터로 받아서, 덮어쓴 후 context로 영구저장소에 저장

- board객체에 log객체 추가, 106~112번라인

4. MO클래스 정보를 표현할 ViewController생성

- board와 log데이터 관계

type regdate board
title contents
Create 2020-05-19 11:12:21 첫 번째 글 글의 내용
Edit 2020-05-19 17:30:02 두 번째 글 글의 내용
Edit 2020-05-19 18:29:46 첫 번째 글 글의 내용

 

*구성 : ListVC에서 Accessory View버튼을 누르면 LogVC로 화면 전환하는 동시에 board값을 동시에 넘김

엔터티 설정에서 Board, List릴레이션 이름을 각각 "board", "logs"로 했으므로, "boardMO객체.logs.array"(1:M관계)로 접근 가능

소스 코드 : github.com/JK0369/CoreDataTestTest

 

cf) CoreData 프로토콜과 in-memory 개념까지 적용한 설계 방법: https://ios-development.tistory.com/236

 

[iOS - swift] CoreData 사용 (protocol 이용, in-memory 개념)

기본개념은 여기 참고 DataModel추가 새로 만들기에서 Data Model추가 완성된 화면 "Add Entity"눌러서 엔터티 추가: 중요한 것은 Data형태의 updateDate를 추가 (이 데이터는 나중에 addData할 때 같은 데이터..

ios-development.tistory.com

 

Comments