2014-07-17 3 views
0

코어 데이터의 엔티티에서 특정 속성에 대한 모든 값을 선택하는 방법을 모색 중입니다. 여기엔티티의 특정 속성 선택 코어 데이터

내 모델 :

I 유형 "문자열"의 3 개 속성으로 "나라"라는 엔티티 있습니다

  • name_en
  • name_fr을
  • name_de

UITableView에 값을 표시하지만 name_en 또는 name_fr 또는 name_de 기반의 값만 표시하고 싶습니다. 사용자 기본 언어. 현재 모든 값이 선택됩니다 (name_en, name_fr 및 name_de).

솔루션 (시몬에게 감사) :

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K MATCHES %@", [NSString stringWithFormat:@"name_%@",[Config getCurrentLocale]], @".{1,}"]; 

[구성 getCurrentLocale이] "FR"OR "드"OR "EN"저를 반환.

다음으로, 요청이 술어를 적용

NSFetchRequest * request = [self defaultRequest]; 

request.predicate = predicate; 

self.fetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:request 
            managedObjectContext:context 
             sectionNameKeyPath:nil 
               cacheName:nil]; 

(지금 해결) 내 문제 ========== 상대 =========

-(NSFetchRequest *) defaultRequest 
{ 

    NSFetchRequest * request = [[NSFetchRequest alloc] init]; 
    NSEntityDescription * entity = [NSEntityDescription entityForName:self.entityName 
              inManagedObjectContext:appDelegate.managedObjectContext]; 
    NSDictionary *attributes = [entity attributesByName]; 

    // Put some stuff here to "filter" the request and show only name_en OR name_fr OR name_de ? 
    request.entity = entity; 
    request.fetchBatchSize = 20; 
    //request.fetchLimit = 50; 

    request.sortDescriptors = self.defaultSortDescriptors; 

    return request; 

} 

당신의 도움을 위해 너희들을 감사합니다

는 여기에 내가 페치 요청을 구축 나의 방법이다. 여기에 편집 한

가있는 UITableViewController의 내 서브 클래스의 데이터 소스 방법입니다 :

#pragma mark - UITableView 

- (NSFetchedResultsController *)fetchedResultsControllerForTableView:(UITableView *)tableView 
{ 
    if (tableView == self.searchDisplayController.searchResultsTableView) 
     return self.searchFetchedResultsController; 

    if (tableView == self.tableView) 
     return self.fetchedResultsController; 

    return nil; 
} 

#pragma mark DataSource 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return [[[self fetchedResultsControllerForTableView:tableView] sections] count]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [[[[self fetchedResultsControllerForTableView:tableView] sections] objectAtIndex:section] numberOfObjects]; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    return [[[[self fetchedResultsControllerForTableView:tableView] sections] objectAtIndex:section] name]; 
} 

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index 
{ 
    return [[self fetchedResultsControllerForTableView:tableView] sectionForSectionIndexTitle:title atIndex:index]; 
} 

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView 
{ 
    return [[self fetchedResultsControllerForTableView:tableView] sectionIndexTitles]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString * identifier = [self cellIdentifierForIndexPath:indexPath]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 

    if (cell == nil) 
     cell = [self newTableViewCellWithIndentifier:identifier]; 

    // Configure the cell. 
    [self tableView:tableView configureCell:cell atIndexPath:indexPath]; 

    return cell; 
} 

편집 2 :

난 그냥 결과를 표시하려면이 같은 시도 출력 :

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Countries"]; 

    fetchRequest.resultType = NSDictionaryResultType; 

    [fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"name_en", nil]]; 

    NSError *error  = nil; 
    NSArray *results = [[AppDelegate sharedInstance].managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

    NSMutableArray *countries = [results valueForKey:@"name_en"]; 

    NSLog(@"Count: %d", countries.count); 

일반적으로 name_en에는 약 246 개 국가가 있으며 그 수는 757입니다! :(

편집 => 내가 여기 해결책을 찾을 이유 그래서, name_fr의 합이 + name_en + name_de ... 이해가 안 : How to fetch unique field values (song_type) from core data

을 지금, 나는 함께 작품에 내 코드에 적응해야 이 코드 조각 :

답변

1
setPropertiesToFetch: 

가져 오기에서 반환해야하는 속성을 지정합니다.

- (void)setPropertiesToFetch:(NSArray *)values 

파라미터

특성 페치에 의해 반환되는 지정 NSPropertyDescription 객체의 배열

.

속성 설명은 일대일 관계, 또는 표현, 특성을 나타낼 수

토론. 속성 또는 관계 설명의 이름은 가져 오기 요청의 엔티티에있는 설명의 이름과 일치해야합니다.

특별 고려 사항, 그렇지 않으면 NSFetchRequestNSInvalidArgumentException 예외가 발생합니다, 당신은이 값을 설정하기 전에 인출 요청에 대한 실체를 설정해야합니다 .

이 값은 resultType이 NSDictionaryResultType으로 설정된 경우에만 사용됩니다.

가용성 iOS 3.0 이상에서 사용할 수 있습니다.

+0

감사합니다. 이미 시도한 것 같아서 효과가 없습니다. 다시 시도하고 작동하는지 알려 드리겠습니다.) – Lapinou

+0

음, 실제로 작동합니다. 하지만 내가 가진 문제는, 내 UITableView에서 모든 값을 name_fr, name_de 및 name_nl 있지만 표시되는 유일한 값이 올바른 것입니다. 내 말은, "name_en"으로 가져 오기 속성을 설정하면 표시되는 값은 "name_en"이지만 내 UITableView에서는 "name_en + name_fr + name_nl 값 ..."과 같은 셀 수가 있습니다. 이유를 이해할 수 없습니다 :/ – Lapinou

+0

@Lapinou UITableViewDatasource Delegate 구현 방법에 대한 코드를 붙여 넣습니다. 귀하의 의견에 당신의 의미를 얻지 못했지만 내 UITableView에서, "name_en + name_fr + name_nl 값 ..."과 같은 셀 수가 있습니다. – Simon

관련 문제