我的数据模型如下: 分类
- >名称
- > 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];
我附上了模特的图片。
获取汽车的代码如下。
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)
发送方中取消注释一些代码进行测试来测试。 (取消注释一次,然后再次评论)代码已更新,可以下载。
如果需要,请更正代码。感谢。
答案 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
}