2014-07-17 105 views
0

我在搜索如何選擇核心數據中實體中特定屬性的所有值。在實體核心數據中選擇特定屬性

這裏我的模型:

我有一個名爲 「國家」,類型爲 「字符串」 的3個屬性的實體:

  • name_en
  • name_fr
  • name_de

我在UITableView上顯示值,但我只想顯示來自name_en或name_fr或name_de的值在用戶默認語言。目前,所有的值都被選中(name_en,name_fr和name_de)。

解決方案(感謝Simon):

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

當[配置getCurrentLocale]返回我 「FR」 或 「德」 或 「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; 

} 

謝謝你們的幫助。

編輯1

這裏是我的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); 

通常,我在名稱中有大約246個國家,計數爲757!因此,name_fr的總和+ name_en + name_de ......我不明白爲什麼:(

編輯=>我發現了一個解決方案在這裏:How to fetch unique field values (song_type) from core data

現在,我已經適應我的代碼與作品這段代碼:)

回答

1
setPropertiesToFetch: 

指定哪些屬性應該由fetch返回。

- (void)setPropertiesToFetch:(NSArray *)values 

參數

NSPropertyDescription對象指定哪些屬性應當由取返回的數組。

討論

屬性描述可以表示屬性,一對一關係或表達式。屬性或關係描述的名稱必須與獲取請求的實體上的描述名稱相匹配。

特別注意事項 你必須爲這個設定值之前的讀取請求的實體,否則NSFetchRequest拋出NSInvalidArgumentException例外。

此值僅在resultType設置爲NSDictionaryResultType時使用。

Availability 適用於iOS 3.0及更高版本。

+0

謝謝!我想我已經嘗試過了,但沒有奏效。我會再試一次,讓它知道它是否有效;) – Lapinou

+0

嗯,它確實有效。但我的問題是,在我的UITableView中,我有來自name_fr,name_de和name_nl的所有值,但唯一顯示的值是正確的。我的意思是,如果我將de屬性設置爲「name_en」,顯示的值是「name_en」,但在我的UITableView中,單元格數等於「name_en + name_fr + name_nl值...」。我不明白爲什麼:/ – Lapinou

+0

@Lapinou將代碼粘貼到實現UITableViewDatasource委託的方式上。沒有得到你的意見 - 但在我的UITableView中,我的單元格數量等於「name_en + name_fr + name_nl值...」 – Simon