NSFetchRequest用于行中的子对象

时间:2014-04-27 04:46:41

标签: ios core-data nsfetchedresultscontroller nsfetchrequest

我的数据模型如下: 分类

- >名称

- > items(“Car”类型的项目数组)

我正在尝试使用section获取名称,而行应该是items(这是NSArray)

这是我的代码,我希望将行作为Car返回,但它仍然返回“Category”。那么,什么可能是NSFetchRequest?

NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:@"Categories"];


NSSortDescriptor *sortDesc=[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortDesc]];

fetchController=[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:delegate.managedContext sectionNameKeyPath:@"name" cacheName:nil];
NSError *fetchError;
[fetchController performFetch:&fetchError];

我附上了模特的图片。

enter image description here

获取汽车的代码如下。

AppDelegate *del=(AppDelegate*)[UIApplication sharedApplication].delegate;
NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:@"Car"];


NSSortDescriptor *sortDesc=[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortDesc]];

fetchController=[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:del.managedContext sectionNameKeyPath:@"Categories.name" cacheName:nil];
NSError *fetchError;
[fetchController performFetch:&fetchError];

代码在此处上传https://www.dropbox.com/s/jjk0nve3pmytui2/TestAppData%202.zip

注意: - 我正在考虑显示空白部分,因为我查看了具有“添加”按钮的标题。因此,用户可以轻松地知道类别的数量。

为了实现上述“注意”中提到的内容,我尝试了以下内容。我创建了一个CarViewController2。它创建了多个部分,这些部分的类别数相同,但行数取决于categoriesRelationship(这是一个NSOrderedSet)。可以通过在ViewController.m的(IBAction) addCategory:(id)发送方中取消注释一些代码进行测试来测试。 (取消注释一次,然后再次评论)代码已更新,可以下载。

如果需要,请更正代码。感谢。

2 个答案:

答案 0 :(得分:2)

您的设置应该是:

NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:@"Car"];
NSSortDescriptor *sortDesc=[[NSSortDescriptor alloc] initWithKey:@"category.name" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortDesc]];

fetchController=[[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                    managedObjectContext:delegate.managedContext 
                                                      sectionNameKeyPath:@"category.name" 
                                                               cacheName:nil];

category.name假设Category items的反向关系为Car category(一对多关系)

请注意,您可能希望更改排序描述符以按某些Car属性

排序

修改

发布模型和当前代码后,您无法按Category名称对数据进行分区,因为它是多对多关系。
您不能为不同的部分提供重复的项目。

如果Car' c'属于类别' g1'和' g2'您可能需要自己构建数据结构,或者引入一个链接汽车和类别之间的中间实体,它将是请求所依据的实体。

编辑2:

在您的项目中,您将carRelation设置为一个Categories实体,这样您就可以形成以下请求:

NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:@"Car"];
NSSortDescriptor *sortDesc=[[NSSortDescriptor alloc] initWithKey:@"carName" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortDesc]];

fetchController=[[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                    managedObjectContext:delegate.managedContext 
                                                      sectionNameKeyPath:@"carRelation.categoryName" 
                                                               cacheName:nil];

这仍然不会显示没有汽车的类别(因为它应该有汽车视图和类别视图)。

编辑3:

CarViewController.m的代码更正:

-(void) getData{
    AppDelegate *del=(AppDelegate*)[UIApplication sharedApplication].delegate;
    NSFetchRequest *req=[[NSFetchRequest alloc] initWithEntityName:@"Car"];
    NSSortDescriptor *descriptor1=[[NSSortDescriptor alloc] initWithKey:@"carRelationship.categoryName" ascending:YES];
    NSSortDescriptor *descriptor2=[[NSSortDescriptor alloc] initWithKey:@"carName" ascending:YES];
    [req setSortDescriptors:@[descriptor1,descriptor2]];
    fetchController=[[NSFetchedResultsController alloc] initWithFetchRequest:req managedObjectContext:del.managedContext sectionNameKeyPath:@"carRelationship.categoryName" cacheName:nil];
    NSError *fetchError;
    fetchController.delegate=self;
    [fetchController performFetch:&fetchError];
    NSLog(@"Fetch ERROR= %@",fetchError);
}

- (NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    id<NSFetchedResultsSectionInfo> sectionInfo=[[fetchController sections] objectAtIndex:section];
    return [sectionInfo name];
}

正如我之前所解释的,这仍然不会显示没有车辆的类别

答案 1 :(得分:0)

试试

NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:@"Category"];
NSSortDescriptor *sortDesc=[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortDesc]];
fetchController=[[NSFetchedResultsController alloc] initWithFetchRequest:request   managedObjectContext:delegate.managedContext sectionNameKeyPath:@"name" cacheName:nil];
NSError *fetchError;
[fetchController performFetch:&fetchError];

NSArray *categories = [fetchedResultsController fetchedObjects];
for(Category *c in categories){
   NSSet *items = c.items;// array that you want
}