하루를살자

[iOS] CoreData 를 배워보자 - 3 [NSFetchRequest, Relationship] 본문

iOS

[iOS] CoreData 를 배워보자 - 3 [NSFetchRequest, Relationship]

Kai1996 2022. 10. 18. 14:50

목차 

- 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!")
   }
Comments