일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 리펙터링
- ribs
- HIG
- collectionview
- 리팩토링
- RxCocoa
- MVVM
- Protocol
- 리펙토링
- UITextView
- swiftUI
- 애니메이션
- combine
- tableView
- UICollectionView
- Observable
- rxswift
- uitableview
- Xcode
- Human interface guide
- uiscrollview
- 스위프트
- map
- 클린 코드
- Clean Code
- clean architecture
- Refactoring
- ios
- SWIFT
- swift documentation
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 13. 코어 데이터(Core Data)의 개념(실습) - (3) 본문
* 기본개념은 링크 참고 ios-development.tistory.com/92
1. 코어 데이터 추가(처음 프로젝트 생성시 "Core Data"체크)
2. Entity, Attributes, Relationships 정의
1) "Board", "Log" 엔터티와, Attributes, Relationship 각 정의
(1) Log엔터티 작성 (Class Name도 LogMO로 작성, Codegen을 "Class Definition"으로)
(2) Board엔터티 작성 (Class Name도 BoardMO로 작성, Codegen을 "Class Definition"으로)
2) Relationships속성 정의
(1) Log 엔터티 관점
- toOne : 하나의 로그는 하나의 게시글만 참고해야 하므로
- Delete Rule 속성 : Cascade (게시글이 삭제되면 이를 참조하는 로그도 같이 삭제되도록)
(2) Board엔터티 관점
※ 주의사항 : 두 릴레이션은 서로 역참조관계(각 입장에서 상대방이 "나"를 참조하고 있는 형태)이므로 "Inverse"속성에 표시
(한쪽에서만 표시하면 자동으로 반대쪽도 설정됨)
- 하나의 게시글을 여러 로그가 참조할 수 있으므로 1:M (toMany)
- 참조되는 로그 레코드들은 참조가 등록된 순서대로 정렬되어 있어야 하므로 ordered 항목 체크
*실제 내부적으로 코드가 구현된 모습 확인 (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) > 데이터베이스' 카테고리의 다른 글
[iOS - swift] 14. UISearchBar와 NSPredicate(코어데이터 조건문) - (4) (0) | 2020.05.20 |
---|---|
[iOS - swift] 12. 코어 데이터(Core Data)의 개념 - (2) (0) | 2020.05.18 |
[iOS - swift] 12. 코어 데이터(Core Data)의 개념 - (1) (0) | 2020.05.13 |
[iOS - swift] 11. FMDB 데이터베이스 (실습) (0) | 2020.05.10 |
[iOS - swift] 10. FMDB 데이터베이스 (기본) (0) | 2020.05.09 |