2012-12-06 10 views
5

코어 데이터 스토리지의 두 테이블/모델에서 "조인"유형 연산을 수행해야하며, 뭔가 얻는 데 좋은 예제를 찾는 데 어려움을 겪고 있습니다. 이 일을하는 것.코어 데이터 - 간단한 JOIN 유형 가져 오기

내가해야 할 일은 상당히 간단합니다. 두 개의 모델/테이블 : location 및 location_categories. location에는 location/establishment의 세부 정보 (고유 ID 포함)가 있고 location_categories 테이블에는 category_id와 연관된 location_id가 들어 있습니다. category_id가 주어지면 두 테이블/모델을 조인하는 모든 위치를 선택해야합니다. 똑바로 SQL이 있었다면 (I 실제 SQLite는 DB에 대해 그것을 실행하면이 쿼리 작업을 수행), 그 결과는 다음과 같습니다

// pretend we passed in a catID of 29: 
SELECT * FROM zlocation where zlocid in (select zlocid from zloccategory where zcatid = 29) 

그래서 당신이 볼 수 있듯이, 그것은 꽤 솔직. 두 가지 가져 오기 및 반복을 수행하지 않고이 작업을 수행 할 수있는 방법이 있습니까? 이 작업을 수행하기위한 현재의 목표 코드는 아래에 있으며 잘 작동하지만 두 테이블 모두에 많은 데이터가 포함되어 있기 때문에 무섭게 느리고 비효율적입니다. 를위한 루프는 거대한 침체의 원인이되고, 내 직감이 작품은 정말 물건의 DB/코어 - 데이터 측에서 수행해야 함을 알려줍니다 :이 하나 하나 가능 여부에

- (NSMutableArray *) fetchLocsWithCatID:(NSString *)catID { 
    NSMutableArray *retArr = [[NSMutableArray alloc] init]; 

    NSManagedObjectContext *context = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:[NSEntityDescription entityForName:MODELNAME_LOCCATEGORIES inManagedObjectContext:context]]; 
    [fetchRequest setPredicate: [NSPredicate predicateWithFormat:@"catID == %@", catID]]; 

    NSError *error; 
    NSArray *locCats = [context executeFetchRequest:fetchRequest error:&error]; 
    NSArray *allLocsArr = [self fetchAllDataForTable:MODELNAME_LOCATION]; // this retrieves contents of entire table 

    for (Location *currLoc in allLocsArr) { 
     for (LocCategory *currLocCat in locCats) { 
      if ([currLoc.locID isEqualToString:currLocCat.locID]) { 
       if (![retArr containsObject:currLoc]) { 
        [retArr addObject:currLoc]; 
       } 
      } 
     } 
    } 

    return retArr; 
} 

어떤 생각 술어/가져 오기? 또는 모르겠다. 아마도 objective-c 코드를 통해 두 개의 NSArrays에 참여하는 더 효율적인 방법이 있을까요?

미리 알려 주시면 감사하겠습니다.

답변

3

가장 좋은 방법은 관계를 사용하는 것입니다.

당신은 또한 LocationCategory 당신은 너무처럼 relationsship을 설정해야

myLocation.locationCategory처럼 액세스 할 수있는 Location를 가져 오는이 방법 :

(Entity)LocationCategory.(relationship)locations <->> (Entity)Location.(relationship)locationCategory 

그건 A와 일대 다 관계를. 반대로도 잊지 마라.

설정이 끝나면 엔티티 인스턴스를 생성 한 곳마다 관계를 연결하면됩니다. 유사 :

Location *myLocation = ... 
LocationCategory *myLocationCategory = ... 
myLocation.locationCategoy = myLocationCategory; 

또한 동일한 MOC를 사용하여 개체를 가져오고 있는지 확인하십시오.MagicalRecord을 사용하면 오브젝트 생성 및 지정된 moc에서의 페치를 쉽게 관리 할 것을 강력하게 권장합니다.

+0

관계를 연결할 필요성에 관해 언급 한 이래로 이것을 가장 좋은 답으로 표시하십시오. 그것은 제가 모델에서 관계를 구현 한 후에도 여전히 저를 곤란하게 만들었습니다. 고맙습니다! – svguerin3

2

핵심 데이터 및 관계에 대해 읽어보십시오. 관련 엔티티의 다른 객체 세트를 자동으로 생성합니다. 위의 경우, 하나의 엔티티 인 Location_Categories를 다른 카테고리로 사용하는 경우 Location Categories 엔티티를 가리키는 Locations 테이블에 관계를 작성하면됩니다.

핵심 데이터 모델링 화면에서이 작업을 수행 할 수 있습니다.

이렇게하면 위치 관리 객체 클래스에 위치 카테고리의 NSSet이 생깁니다. 마찬가지로 위치 카테고리 엔터티에는 위치 개체가 포함됩니다.

위의 방법과 마찬가지로 위치 카테고리에 대한 검색어 하나만 있으면됩니다. 하지만 그 대신 추가 질의를하고 당신은 모든 핵심 데이터 튜토리얼이에 당신을 도울 수 있어야한다

for (LocationCategory *locationCategory in locationCats) { 
    NSLog(@"Location name is %@",locationCategory.location.locationName); 
    // You can ofcourse add it to an arrary or what ever 
} 

수행해야합니다.

+0

Brilliant, 고맙습니다! 나는 내 모델에서 관계를 사용하는 것을 피하는 바보처럼 느껴진다. 나는 그다지 중요하지 않다고 생각했지만, 이제 나는 그 점을 본다. :) 나는 이런 식으로 관계를 사용할 수 있을지 전혀 몰랐습니다. (Core Data를 처음 접했습니다.) 지금은 괜찮아. 도와 주셔서 다시 한 번 감사드립니다! – svguerin3

1

이러한 엔티티가 CoreData에서 모델링 된 경우 대개 location_categories와 위치가 연관되어 있으며 위치는 location_categories와 반대 관계입니다. 그래서 "Location"이라는 엔티티가 있다면 locationCategory라는 이름의 관계가 있고 LocationCategory 엔티티에는 Location이라는 관계가 있습니다. 정의 양방향 관계의 종류와

, 나는 다음과 같은 내 요청을 가져올 사용하여 뭔가를 설정합니다 : 주어진에 위치 범주와 관련된 모든 위치의 객체를 반환해야

[fetchRequest setEntity:[NSEntityDescription entityForName:MODELNAME_LOCATIONS inManagedObjectContext:context]]; 
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:@"locationCategory.catID == %@", catID]]; 

종류 ID

관련 문제