带有NSSortDescriptor的NSFetchedResultsController一对一

问题描述:

想要使用NSSortDescriptorNSFetchedResultsController中使用一对一关系的名称进行排序。在这里我的代码带有NSSortDescriptor的NSFetchedResultsController一对一

NSFetchRequest <studentDetail *> *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[studentDetail entityName]]; 

NSSortDescriptor *sortDescriptorForSchoolName = [NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(schoolName)) 
                      ascending:YES 
                       selector:@selector(localizedCaseInsensitiveCompare:)]; 

NSSortDescriptor *sortDescriptorForSchool = [NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(school)) 
                       ascending:YES]; 

[fetchRequest setSortDescriptors:@[sortDescriptorForSchool, sortDescriptorForSchoolName]]; 

[fetchRequest setFetchBatchSize:4]; 

NSManagedObjectContext *mainContext = [[coreDataManager sharedManager] managedObjectContext]; 

NSFetchedResultsController *FRC = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                         managedObjectContext:mainContext 
                         sectionNameKeyPath:nil 
                            cacheName:nil]; 

[FRC setDelegate: self]; 

NSError *fetchError = nil; 

if (![FRC performFetch: &fetchError]) 
    NSLog(@"fetch error: %@", fetchError); 

[self setStudentDetailFetchedResultsController: FRC]; 

实例DB格式:

  1. 学校和学生的实体名称。
  2. 与学生一对多的学校关系。
  3. 共有4所学校。每所学校有4名学生。
  4. 现在我想显示所有学生名单的名称升序排序。

UITableView我正在显示学生的详细信息。有一个选项可以按排序school实体进行排序。在我的FRC有studentDetail。我怎样才能将这些细节与FRC分类?

studentDetail实体与school有一对一的关系。

更新

school entity一对多

school1 
relationship 
    ->student1 
    ->student2 
    ->student3 
    ->student4 
school2 
relationship 
    ->student5 
    ->student6 
    ->student7 
    ->student8 
school3 
relationship 
    ->student9 
    ->student10 
    ->student11 
    ->student12 
school4 
relationship 
    ->student13 
    ->student14 
    ->student15 
    ->student16 

student entity一对一

student1 
relationship 
    ->school1 
student2 
relationship 
    ->school1 
student3 
relationship 
    ->school1 
student4 
relationship 
    ->school1 
student5 
relationship 
    ->school2 
student6 
relationship 
    ->school2 
student7 
relationship 
    ->school2 
student8 
relationship 
    ->school2 
student9 
relationship 
    ->school3 
student10 
relationship 
    ->school3 
student11 
relationship 
    ->school3 
student12 
relationship 
    ->school3 
student13 
relationship 
    ->school4 
student14 
relationship 
    ->school4 
student15 
relationship 
    ->school4 
student16 
relationship 
    ->school4 

enter image description here

Got answer from感谢@RunLoop。但是这需要一些我想要的改变。

正如我在我的代码提到了排序NSStringFromSelector(@selector(school))一样,例如:如果我在实体更改任何名称,而不是[NSSortDescriptor sortDescriptorWithKey:@"school.schoolName" ascending:YES]

[NSSortDescriptor sortDescriptorWithKey[NSString stringWithFormat:@"%K.%K", NSStringFromSelector(@selector(school)), NSStringFromSelector(@selector(schoolName))] ascending:YES]如果我用这种方法,在功能,这是显示警告和静态的school.schoolName没有。那可能吗? 我试过这个方法,NSPredicate没有显示任何警告。我应该如何解决这个问题?

+0

你想要DB值还是DB流程图? – user3589771

+0

@RunLoop你现在可以检查吗?更新的问题。如果我错过了这里的任何评论。 – user3589771

下面的代码将获取的学生,通过schoolName下令然后通过studentName:

NSFetchRequest *fr = [NSFetchRequest fetchRequestWithEntityName:@"Student"]; 
NSSortDescriptor *schoolNameSD = [NSSortDescriptor sortDescriptorWithKey:@"school.schoolName" ascending:YES]; 
NSSortDescriptor *studentNameSD = [NSSortDescriptor sortDescriptorWithKey:@"studentName" ascending:YES]; 
fr.sortDescriptors = @[schoolNameSD, studentNameSD]; 

NSManagedObjectContext *moc = [[coreDataManager sharedManager] managedObjectContext]; 


NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fr 
                      managedObjectContext:moc 
                      sectionNameKeyPath:nil 
                        cacheName:nil]; 
[frc performFetch:nil]; 

如果你只是想通过studentName进行排序,只需删除schoolNameSD并要求FRC再次进行抓取。

+0

感谢@RunLoop。有效!!!其实我之前尝试过,当时这种方法不起作用。但是我想用这个'NSStringFromSelector(@selector(schoolName))'格式。我试着用'NSString'来使用,我得到了警告。 '[NSString stringWithFormat:@“%K.%K”,NSStringFromSelector(@selector(school)),NSStringFromSelector(@selector(schoolName))]'warning'无效的转换说明符K'。如果我使用这种方法,在功能上,如果我在实体中更改任何名称,它会显示警告和静态的“学校”。schoolName'不是这个原因,你能帮助解决这个问题吗? – user3589771

+0

嗨,很高兴我能帮到你。请点击✓标记我的答案为正确的。您不应该使用选择器指定排序键。如果你想执行一个不同的排序,分配一个新的排序描述为FRC,并要求它的度假胜地。 – RunLoop

+0

不,不是另一种相同的。我将标记为正确的,但我仍然需要里面我是用另一种类型的确切的形成,还我喜欢这种格式后问题太多。 '[NSSortDescriptor sortDescriptorWithKey [NSString的stringWithFormat:@ “%K.%K”,NSStringFromSelector(@selector(学校)),NSStringFromSelector(@selector(schoolName))]升序:YES]'代替[NSSortDescriptor sortDescriptorWithKey的':@“校.schoolName”升序:YES]'这一个给韦林氏'无效转换说明K'。我试图找出自己(在发布这个问题之前),但我无法得到我想要的。 – user3589771