在实体Core Data中选择特定属性

时间:2014-07-17 08:49:48

标签: ios iphone uitableview core-data nsfetchrequest

我正在搜索如何为Core Data中的实体选择特定属性的所有值。

这是我的模特:

我有一个名为“Countries”的实体,其中包含3个“String”类型的属性:

  • name_en
  • name_fr
  • name_de

我在UITableView上显示值,但我只想根据用户默认语言显示name_en或name_fr OR name_de中的值。目前,所有值都被选中(name_en,name_fr和name_de)。

解决方案(感谢Simon):

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

[Config getCurrentLocale]返回“fr”或“de”或“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);

通常,我在name_en有大约246个国家,计数是757!所以,name_fr + name_en + name_de的总和......我不明白为什么:(

编辑=>我在这里找到了一个解决方案:How to fetch unique field values (song_type) from core data

现在,我必须调整我的代码才能使用这段代码:)

1 个答案:

答案 0 :(得分:1)

setPropertiesToFetch:

指定fetch应返回哪些属性。

- (void)setPropertiesToFetch:(NSArray *)values
  

参数

     

     

一组NSPropertyDescription个对象,用于指定fetch应返回哪些属性。

     

讨论

     

属性描述可以表示属性,一对一关系或表达式。属性或关系描述的名称必须与获取请求的实体上的描述名称匹配。

特别注意事项 您必须在设置此值之前为获取请求设置实体,否则NSFetchRequest会抛出NSInvalidArgumentException例外。

仅当resultType设置为NSDictionaryResultType时才使用此值。

状况 适用于iOS 3.0及更高版本。