일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Persistent store Coordinator
- CoreData
- LightWeight Migration
- Java
- Swift 고차함수
- codability
- NSSortDescriptor
- 다익스트라 이해
- CoreData Concurrency
- Swift LinkedList
- expensive operation
- 2022 부스트캠프
- CoreData Filter
- 1009번
- persistentStoreCoordinator
- Raw value and Associated value
- Associated Value
- CoreData Stack
- Swift closure
- iOS Static Library
- Clean swift
- 일급 객체
- leetcode #01
- dateFormatter
- NSManagedObject SubClass
- 트레일링 클로저
- 스위프트 클로저
- Swift
- iOS Static Library 사용하는방법
- NSPredicates
- Today
- Total
하루를살자
[iOS] CoreData 를 배워보자 - 3 [NSFetchRequest, Relationship] 본문
목차
- Relationship
- NSFetchRequest (NSSortDescriptor, Predicates)
Relationship
NSManagedObjectModel 에 생성해 놓은 entity 들의 관계를 설정해줄수있다. 예를들어, 하나의 휴대폰기기(Deivce) 는 한명의 소유자 (Owner) 를 가질수 있지만, owner 는 여러개의 device 를 가질수 있다는 관계도를 설정해보자.
관계도는 아래와 같이 Entity 의 Relationship 부분에서 설정해줄수있다. 여기서 중점으로 봐야할것들은 아래와 같다.
- Relationship = 현재 entity 의 어떤 관계를 갖는지
- Destination = 어떤 Entity 와 이런 관계를 가지고 있는지
- Inverse = 한쪽에서의 변화가 역방향으로도 전파될 수 있는지
- DeleteRule = 관계를 맺은 Object 들 중 하나가 삭제될시 record 관리 를 어떻게 할지
- Type = 1:1, 1:m, m:m 등의 관계를 나타낼때 사용
*자세한 delete rule 은 여기를 참조.
- Deivce
- Relationship = 하나의 기기와 소유자 의 관계를 정의할때 Deivce 의 입장에서 Person 는 Owner 의 역할을 하기 때문에 Person 쪽으로 가는Relationship 을 owner 라고 설정해주었다.
- Destination = 현재 관계는 person 과 맺기 때문에 destination 은 person entity 로 설정해주었다.
- Inverse = Inverse 를 device 로 설정해주어 person 과 양방향 관계를 맺어주는데, device 의 변경이 생길시, person 이 가지고 있는 device 에도 변경이 적용되도록 해주기 위해서 inverse 를 device 로 설정해주었다.
- Delete Rule = Nullify 로 설정해주면 owner 혹은 deivce 가 삭제되었을때 특정 record 는 삭제된 상대방의 record 를 인식하여 자신이 관계에 있는 데이터를 업데이트 한다.
-Type = device 는 한명의 owner 를 가지게 하기위해서 To One 으로 설정
- Person
-Type = 한명의 owner 는 여러개의 기기를 소유할수 있기때문에 To many 로 설정해주었다.
Relationship Diagram
NSFetchRequest
NSFetchRequest 는 2개의 Optional 프로퍼티(NSPredicate, NSSortDescriptor) 가 존재한다. NSPredicate 와 NSSortDescriptor 가 무었인지 알아보고 사용법을 알아보자.
Predicates
Predicates 의 어원 = 서술어
ex) ‘뛰어가다’는 서술어의 종류 중 ( 어떠하다 , 어찌하다 , 무엇이다 )에 해당한다.
iOS 에서는 인풋에 따라서 True/False 로 나타낼수 있는 하나의 Statement 로, Cocoa 전체적으로 사용되는 용어이다. CoreData 에서는 object graph 에서 데이터를 필터링 하는데 FetchRequest 와 같이 사용되어진다.
사용법은 간단하게 key (특정 속성) 와, 이에 맞는 value (특정 데이터) 설정해주므로써 사용가능하다. 이러한 Predicate 을 작성하는 방법은 SQL 문같이 특정 문법에맞게 사용해야하는데, 아래 링크를 참조해서 작성하면 된다.
- ex) deviceType 이 iPhone 인 데이터만 filter 하는작업
let fetchRequest = Device.fetchRequest()
let filterPredicate = NSPredicate(format: "deviceType == '\(iPhone)'")
//위에것과 똑같음 deviceType =[c] 은 case insensitive 하게 만들어줌
let filterPredicate = NSPredicate(format: "deviceType =[c] %@", "iPhone")
fetchRequest.predicate = filterPredicate
NSSortDescriptor
Persistent store 에 저장되는 데이터들은 순서 없이 저장이되기 때문에 fetching 해오는 과정에서 어떤식으로 sort 를 해주어 받아올지 명시를 해주지 않으면 원하는 순서대로 데이터를 받아올수 없습니다.
Objective-C 에서 부터 배열을 sort 해주려면 NSSortDescriptor 를 사용해야했었야했다. Fetching 해오는 result 값들의 형태가 [NSManagedObject] 이므로, NSSortDescriptor 를 사용해서 sorting 을 진행 해주어야한다.
- ex) 이름순으로 fetch 된 데이터 Sorting 하기
let fetchRequest = Device.fetchRequest()
//Entity 의 속성을 특정해서 sort 가능
let sortDiscriptor = NSSortDescriptor(key: "name", ascending: true)
//NSFetchRequest 의 sortDescriptor 에 설정가능.
fetchRequest.sortDescriptors = [sortDiscriptor]
do {
let players = try AppDelegate.persistentContainer.viewContext.fetch(fetchRequest)
data = players
} catch {
print("Not Able to fetch Player Data!")
}
'iOS' 카테고리의 다른 글
[iOS] Static Library 만들기 (using Objective-C) (1) | 2022.12.22 |
---|---|
[iOS] CoreData 를 배워보자 - 5 [CoreData Concurrency] (0) | 2022.10.28 |
[iOS] CoreData 를 배워보자 - 4 [LightWeight Migration] (0) | 2022.10.18 |
[iOS] CoreData 를 배워보자 - 2 (0) | 2022.10.14 |
[iOS] CoreData 를 배워보자 -1 (0) | 2022.10.14 |