2013-04-28 3 views
4

검색 한 적이 있지만 누군가가 나를 명확히하기를 희망하는 다양한 개념에 대해 아직 명확하지 않습니다.일대 다 관계 데이터를 가져 오는 코어 데이터

일종의 사용자 ID를 존중하면서 운동/일상 업무용 엔티티에 저장하려고하면 혼란과 두통이 발생합니다.

코어 데이터를 중심으로 설정 한 방식으로 코어 데이터를 읽었을 때 작업하는 사용자를 존중하면서 일상적인 작업과 운동에 정보를 저장하고 저장할 수 있어야합니다. 내가 틀렸다면 누구든지 나를 바로 잡을 수 있을까?

나는

INSERT INTO Routine (Values) WHERE Routine.userID = user.usersExercise 

것을 맞 내가 (SQL 측면에서)과 같은 형태의 쿼리를해야 할 것 같아? 그게 맞다면. 이제 내가 겪어 본 문제는 coreData 코드에서이 두 엔티티의 내부 조인을 만들어 이와 같은 질의를 생성하는 방법을 모른다는 것입니다.

도움이 정말 감사합니다!

enter image description here

+3

CoreData에 대한 생각은 데이터베이스 용어입니다. 사용자를 확보하면 myUser.routines (또는 관계가 무엇이든간에)해야합니다. 관계를 속성으로 생각하십시오. – sosborn

답변

3

예 특정 사용자에 관련된 데이터를 얻을 자 NSPredicate를 사용해야합니다. UICollection 뷰를 채우는 경우 NSFetchedResultsController를 읽는 것이 좋습니다.

NSFetchRequest *fetchRequestItems = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entityItem = [NSEntityDescription entityForName:@"Routine" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequestItems setEntity:entityItem]; 

User* myUser = //Code for getting current user out of data store based on some paramator 
[fetchRequestItems setPredicate:[NSPredicate predicateWithFormat:@"userID == %@",myUser]]; 

//Sort by last edit ordered 
NSArray *sortDescriptors = [NSArray arrayWithObjects:nil]; 
[fetchRequestItems setSortDescriptors:sortDescriptors]; 

NSArray* Routines = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

여기서 주목해야 할 것은 것은 당신이 당신의 일상에 역의 관계를 설정할 필요가있다/운동 술어에서 현재 사용자에 대해 비교하는 객체. 당신이 가지고있는 userID는 역 관계입니까?

의견에서 나는 반항 관계를 설정하지 않으므로 여기서 거친 예를 들어 보겠습니다. 상점에 새로운 사용자를 만들 때

는이 같은 somethign 얻을 것입니다 :

User *thisUser = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.managedObjectContext]; 

thisUser.eMail = emailAddress.text; 
//And any other paras you might have 

을 그럼 당신이 할 것 해당 사용자에 대한 일상적인시 : 다음

Routine *newRoutine = [NSEntityDescription insertNewObjectForEntityForName:@"Routine" inManagedObjectContext:managedObjectContext]; 

newRoutine.userId = thisUser; 

을해야합니다을 변경 사항을 데이터 저장소에 기록하려면 관리 객체를 저장하십시오. 이것은 루틴쪽에있는 2 개의 객체를 링크합니다. 엄격한 역관계를 위해 Users 쪽에서 링크하는 것을 잊지 마십시오. 내가 위에서 언급 한 것처럼

정확하게 사용자의 효율적으로 활용하려면 다음 작업을

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSError* error; 
NSArray* Users = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

당신이 배열 한 사용자가 다음의 첫 번째 요소가있는 경우, 당신은 다음에 따라 하나를 찾기 위해 술어를 사용하는 많은 사용자가있는 경우 FB ID.

+0

역관계 란 루틴과 사용자 엔티티에서 동일한 사용자 ID를 의미합니까? 나는 하나를 넣지 않았다 .... 나는 coredata에서 관계 개념의 전체 poing? 그게 내가 이해하기 힘든 것을 찾는거야. 사용자 ID <-->> userRoutine. 하지만 루틴에서 idUserInternal이있는 특성을 만들어야한다고 생각합니다. 옳은? –

+0

네가 SQL 테이블/행에있는 것처럼 엄격한 고유 ID를 갖는 것 같지 않습니다.여기에서 Routine/Exercise 객체에 포함 된 User 객체를 직접 비교합니다. 따라서 새로운 루틴 오브젝트를 인스턴스화 할 때 루틴 오브젝트에 사용자 요소가 있고이를 사용자에게 속하게됩니다. Apple은 핵심 데이터를 사용하여 액세스 속도를 높이고 유효성 검사를보다 정확하게하므로 역관계를 설정하는 것이 좋습니다. – Dev2rights

+0

나는 그 때 그것을 볼 필요가있다. 감사. 그러나 코드 예제에서 사용자를 가져 오는 방법이 없습니다. FB API로 작업하고 있다고 가정 해 봅시다. 사용자는 User.idFB와 igual 인 _isLoggedin.id입니다. 어떻게 코드의 해당 부분을 완성하겠습니까 ?? 혼란 스러워요 –