-
Notifications
You must be signed in to change notification settings - Fork 0
CoreData 사용법
여기에서 Attribute들은 개인 테이블 속성, Relation들은 외래키를 의미함. Relation 표의 앞글자(O, M)은 각각 To One, To Many를 의미함. Data\Model로 들어가서 오른쪽 탭 열면 자세한 것까지 확인/변경 가능하다.
Book entity (entity == 테이블)
![스크린샷 2023-11-30 오전 10 46 21](https://private-user-images.githubusercontent.com/60872311/286790630-5c7379cd-c779-4829-b2c9-6df49c86efc6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjY5NjMsIm5iZiI6MTczODkyNjY2MywicGF0aCI6Ii82MDg3MjMxMS8yODY3OTA2MzAtNWM3Mzc5Y2QtYzc3OS00ODI5LWIyYzktNmRmNDljODZlZmM2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDExMTEwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQ5YTFkZGY2NWE1MGUzNWI5ODBhYTM3NGE2NzYwOGI2Y2I3YzUwMDIxMmY3NjIyZTVkZjgzYTlhMDkyZDYwNzMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.re3hFJio4LsyckWmvy2q0chTZ9gWOEX9HN7OjcBGBMY)
ReadingList entity
![스크린샷 2023-11-30 오전 10 42 22](https://private-user-images.githubusercontent.com/60872311/286789972-cbf2055f-a495-484c-ada6-92cfdb620327.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjY5NjMsIm5iZiI6MTczODkyNjY2MywicGF0aCI6Ii82MDg3MjMxMS8yODY3ODk5NzItY2JmMjA1NWYtYTQ5NS00ODRjLWFkYTYtOTJjZmRiNjIwMzI3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDExMTEwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWIxYmYyNTAwZWJmMmUxNTY5MTY2M2Q1YjI5ZDJjNjg4MjI1NzZlYmVlYmViNDhiYWQ5YmIyZWJiYzhlNjkxZTQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.7OZyKqXyuwiJ42IcTy1ajaDmNo_vI0NaW9Zxrj8WRhg)
ReadList entity
![스크린샷 2023-11-30 오전 10 42 40](https://private-user-images.githubusercontent.com/60872311/286790016-0b6bdcbd-90b4-4b75-a87b-b0e8b47a8f56.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjY5NjMsIm5iZiI6MTczODkyNjY2MywicGF0aCI6Ii82MDg3MjMxMS8yODY3OTAwMTYtMGI2YmRjYmQtOTBiNC00Yjc1LWE4N2ItYjBlOGI0N2E4ZjU2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDExMTEwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRmMjljNWJmOWUyYTk1MjA3NGM4OWM4ZDM0MDQzOGE4MTA2ODllOTFmODM3ZTA3NGE1OWJjNDgwYzM5ZmQ3ZmImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.6vl2O86Zp8NBv5XYPwVRZXQUhNBQcq0Hh7Um4lcOpjc)
ReadLog entity
![스크린샷 2023-11-30 오전 10 42 58](https://private-user-images.githubusercontent.com/60872311/286790076-8dc34225-be6b-497f-a342-3a8b305c6830.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjY5NjMsIm5iZiI6MTczODkyNjY2MywicGF0aCI6Ii82MDg3MjMxMS8yODY3OTAwNzYtOGRjMzQyMjUtYmU2Yi00OTdmLWEzNDItM2E4YjMwNWM2ODMwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDExMTEwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWFhMDg0YWM1ODEzNzNkMjQ1Njc0ODU0MjI4Njg3ODE1ZDBlODRkMTEzYzFhMDA4NjhmZWQ0MDUwZTBiNmVlOGMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.70x7i5gkdASl3GUuue0uZH5iEDya7Ht1x07sF6fEmr8)
![스크린샷 2023-11-30 오전 11 04 06](https://private-user-images.githubusercontent.com/60872311/286793650-0c63aa8a-258a-4887-baf7-b011720f35cf.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjY5NjMsIm5iZiI6MTczODkyNjY2MywicGF0aCI6Ii82MDg3MjMxMS8yODY3OTM2NTAtMGM2M2FhOGEtMjU4YS00ODg3LWJhZjctYjAxMTcyMGYzNWNmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDExMTEwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTA1NjgyMWI5NjcwNzZiYTg4NjI2ZWViOTg0NGM2MzY4YmNjNGFiZWY0YjhkOTE0NWYzYzE4ODVhMWE2NTNmMmImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.T6Zr5zYQxl65rxjJaKsXgMzYRUEd47FnrKLLj2Uai90)
- import CoreData 한다.
- 클래스 안에서 환경변수 설정한다. : @Environment(.managedObjectContext) private var viewContext
- @FetchRequest 한 후 FetchedResults<(가져올 entity 이름)> 하면 받을 수 있다.
@FetchRequest parameter 설명
- SortDescriptors: 데이터들 정렬기준. NSSortDesriptor로 하나씩 추가할 수 있다. keyPath는 정렬하려는 키. ascending은 true면 오름차순, false면 내림차순.
- predicate: 제약조건. NSPredicate(format: "~~~")로 둘 수 있고 제약조건 여러개는 (format: "recent == true and pinned == false") 이런식으로 붙여주면 된다. 쿼리에 변수를 집어넣고 싶으면 (format: "readTime == %@", date) 이런식으로 한다. 근데 변수값을 읽어들이지 못하네.. 그냥 filter함수 이용하는게 우선 더 편해보인다. NSPredicate 문법 링크: https://onelife2live.tistory.com/35
FetchedResults는 바인딩으로 넘겨줄 수 없음. 따라서 필요한 데이터들만 따로 구조체 만들어서 넘겨주거나 Fetch 쿼리를 필요한 뷰에 하나씩 직접 넣어줘야함.
4. 받아온 아이템은 ForEach 구문으로 하나씩 보거나 .first 메소드로 첫번째 결과만 보거나 할 수 있다. attribute나 relation은 .{이름} 쓰면 값 참조할수 있다. (attribute가 null값일수도 있어서 언래핑해줘야함)
![스크린샷 2023-11-30 오전 11 21 03](https://private-user-images.githubusercontent.com/60872311/286796357-8e3f8123-7c5a-4ce0-a07c-dc64afd4ea18.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjY5NjMsIm5iZiI6MTczODkyNjY2MywicGF0aCI6Ii82MDg3MjMxMS8yODY3OTYzNTctOGUzZjgxMjMtN2M1YS00Y2UwLWEwN2MtZGM2NGFmZDRlYTE4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDExMTEwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThhMzIzYTU0YTMyM2VmMDhhMjg2OTNhNTFlY2RmMzRlNGExMDk1Mjk3MGYwNDg5OWQyZmU4MmFiOGNkMGIxMDAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.xMChJHE2foMyNRG0YzzB_AsZS00ffhKapwQuidFu_Xc)
1대다 관계의 relation의 필드는 NSSet 데이터타입을 가지는데 이 타입은 제약이 많으므로(사용가능한 메소드가 거의없음...) Swift의 Set으로 typecasting해서 열어볼 수 있다.
![스크린샷 2023-11-30 오전 11 22 18](https://private-user-images.githubusercontent.com/60872311/286796572-10321cb3-5fe8-48c6-a0f4-30070e298109.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjY5NjMsIm5iZiI6MTczODkyNjY2MywicGF0aCI6Ii82MDg3MjMxMS8yODY3OTY1NzItMTAzMjFjYjMtNWZlOC00OGM2LWEwZjQtMzAwNzBlMjk4MTA5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDExMTEwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTA4YjZjODQxMWM5MGU1ZDlkM2I2YTlmNmRhZGU2Yjg2NjBmOGNiOTBiZjczODBmNDI4NzBkYWI3ZGNjNzY4OWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.CX7e6-HKrC_GgtdvrKJd_aH46HF8Ov7LfX1zm_8GUy4)
![스크린샷 2023-11-30 오후 1 51 30](https://private-user-images.githubusercontent.com/60872311/286820135-2db272f7-ee86-43af-b238-15f09b44e881.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjY5NjMsIm5iZiI6MTczODkyNjY2MywicGF0aCI6Ii82MDg3MjMxMS8yODY4MjAxMzUtMmRiMjcyZjctZWU4Ni00M2FmLWIyMzgtMTVmMDliNDRlODgxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDExMTEwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI0ZWIwZjNjYTViYjc5ZWE0YmUyNjFjMjAwNGU5Mzg1NDk5YWRhN2FiYTVjOTljM2RmZjgzYmZjOTJiNjQwODkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.hSbNmhS3yk3PsS_jRY_q2dNKpe5Ala8UhO0CJd-XjSY)
- Add하려는 entity의 클래스 변수 만들어 주고 데이터 작성한다.
- 연결해줘야 하는 다른 entity의 데이터를 가져오고 relation을 양방향으로 적용한다.
- viewContext.save()
Fetch와 마찬가지로 1대다 relation의 경우에 NSSet은 고정된 배열이므로 Swift의 Set 상태에서 relation을 추가한 후 NSSet으로 typecasting해서 넣어준다.
![스크린샷 2023-11-30 오전 11 25 52](https://private-user-images.githubusercontent.com/60872311/286797183-b624868d-a194-4f5e-82fd-3cee40d775f6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjY5NjMsIm5iZiI6MTczODkyNjY2MywicGF0aCI6Ii82MDg3MjMxMS8yODY3OTcxODMtYjYyNDg2OGQtYTE5NC00ZjVlLTgyZmQtM2NlZTQwZDc3NWY2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDExMTEwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThjYjU1MjQ5MDk4ZmJlYmNmNGEwZDVjNGQ5YzFkNGM2NGFjOWM3ZGY4NTdhNDk0ZTA1ZGY3YjJjOThjMmY5NWImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.0SRo37gOJ38VpgNtxo8_-G7U0YjtdOp1OvVYDgvFRz4)
![스크린샷 2023-11-30 오전 11 27 54](https://private-user-images.githubusercontent.com/60872311/286797461-3e455d64-d1c3-4021-98b7-1b8500ff8db4.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjY5NjMsIm5iZiI6MTczODkyNjY2MywicGF0aCI6Ii82MDg3MjMxMS8yODY3OTc0NjEtM2U0NTVkNjQtZDFjMy00MDIxLTk4YjctMWI4NTAwZmY4ZGI0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDExMTEwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBkZDE1MmExNWQ5NThhYWY0ZTFmYWUzYmU3NjFlNjA5NzExMDQ5M2M5MjM1YWJmNzljNjY5ZGJiZGU4NGY2ODQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.GZ-z065GRHv_JHAQu-cuxGz_TnRCAwbMGN05qkVtl_s)
offsets.map { items[$0] }.forEach(viewContext.delete)로 처음 column에 있는 데이터를 지울 수 있다.
여기에서 데이터를 설정해두면 Xcode의 Preview 영역에서 데이터가 표시된다.
![스크린샷 2023-11-30 오전 11 31 34](https://private-user-images.githubusercontent.com/60872311/286798057-e1826f12-3332-444f-aac6-b3c1b2cd0ed1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5MjY5NjMsIm5iZiI6MTczODkyNjY2MywicGF0aCI6Ii82MDg3MjMxMS8yODY3OTgwNTctZTE4MjZmMTItMzMzMi00NDRmLWFhYzYtYjNjMWIyY2QwZWQxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDExMTEwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZhMDk0YWU3N2MzOWZlNGI2NzQ0YzFjMGIxYzczZWQxM2Y2NjczYjA1MzVlZDk1ODRhNmM4YTFjMzI2NjcyNzkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.FXg62Dn_ueRi5fjjx9fqELYTPKIqA00X-umeDGKf2u8)
이렇게 Data\Persistence의 preview 필드에 원하는 데이터를 집어넣으면 된다.
미리보기를 원하는 View에서는 Preview에 .environment(.managedObjectContext, PersistenceController.preview.container.viewContext) 를 추가해 주어야 한다.