Skip to content

CoreData 사용법

Hyunsu Kim edited this page Dec 7, 2023 · 16 revisions

CoreData DB 구조

여기에서 Attribute들은 개인 테이블 속성, Relation들은 외래키를 의미함. Relation 표의 앞글자(O, M)은 각각 To One, To Many를 의미함. Data\Model로 들어가서 오른쪽 탭 열면 자세한 것까지 확인/변경 가능하다.

Book entity (entity == 테이블)

스크린샷 2023-11-30 오전 10 46 21

ReadingList entity

스크린샷 2023-11-30 오전 10 42 22

ReadList entity

스크린샷 2023-11-30 오전 10 42 40

ReadLog entity

스크린샷 2023-11-30 오전 10 42 58

데이터 Fetch하는 법

스크린샷 2023-11-30 오전 11 04 06
  1. import CoreData 한다.
  2. 클래스 안에서 환경변수 설정한다. : @Environment(.managedObjectContext) private var viewContext
  3. @FetchRequest 한 후 FetchedResults<(가져올 entity 이름)> 하면 받을 수 있다.
    @FetchRequest parameter 설명
  1. SortDescriptors: 데이터들 정렬기준. NSSortDesriptor로 하나씩 추가할 수 있다. keyPath는 정렬하려는 키. ascending은 true면 오름차순, false면 내림차순.
  2. 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

1대다 관계의 relation의 필드는 NSSet 데이터타입을 가지는데 이 타입은 제약이 많으므로(사용가능한 메소드가 거의없음...) Swift의 Set으로 typecasting해서 열어볼 수 있다.

스크린샷 2023-11-30 오전 11 22 18

데이터 Add하는 법

스크린샷 2023-11-30 오후 1 51 30
  1. Add하려는 entity의 클래스 변수 만들어 주고 데이터 작성한다.
  2. 연결해줘야 하는 다른 entity의 데이터를 가져오고 relation을 양방향으로 적용한다.
  3. viewContext.save()

Fetch와 마찬가지로 1대다 relation의 경우에 NSSet은 고정된 배열이므로 Swift의 Set 상태에서 relation을 추가한 후 NSSet으로 typecasting해서 넣어준다.

스크린샷 2023-11-30 오전 11 25 52

데이터 Delete하는 법

스크린샷 2023-11-30 오전 11 27 54

offsets.map { items[$0] }.forEach(viewContext.delete)로 처음 column에 있는 데이터를 지울 수 있다.

Preview Data 설정

여기에서 데이터를 설정해두면 Xcode의 Preview 영역에서 데이터가 표시된다.

스크린샷 2023-11-30 오전 11 31 34

이렇게 Data\Persistence의 preview 필드에 원하는 데이터를 집어넣으면 된다.

미리보기를 원하는 View에서는 Preview에 .environment(.managedObjectContext, PersistenceController.preview.container.viewContext) 를 추가해 주어야 한다. 스크린샷 2023-11-30 오후 2 49 24