【问题标题】:NSFetchedResultsController not sorting on initial fetchNSFetchedResultsController 未在初始提取时排序
【发布时间】:2012-05-25 15:59:19
【问题描述】:

我遇到了NSFetchedResultsController 的核心数据问题。我在父实体和子实体之间有一对多的关系。 childFetchedResults.fetchedObjects 属性中的数组未按 number 排序(数字是模型中的 int32 属性)。我是否使用MagicalRecord 便利类别方法似乎并不重要。

NSFetchRequest *req = [Child MR_requestAllSortedBy:@"number" ascending:YES withPredicate:[NSPredicate predicateWithFormat:@"parent = %@", self.parent]];
childFetchedResults = [[NSFetchedResultsController alloc] initWithFetchRequest:req managedObjectContext:[NSManagedObjectContext MR_defaultContext] sectionNameKeyPath:nil cacheName:nil];
childFetchedResults.delegate = self;
NSError *error;
[childFetchedResults performFetch:&error];
NSLog(@"fetched objects: %@", childFetchedResults.fetchedObjects);

但是,如果我使用完全相同的排序描述符对获取的对象数组进行排序,它可以正常工作:

NSLog(@"fetched objects: %@", [childFetchedResults.fetchedObjects sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"number" ascending:YES]]]);

我认为,在为获取请求指定排序描述符时,您只能使用 Core Data 可以传递给 SQLite 存储的比较器。但我觉得在这种情况下这不重要,因为 SQLite 必须支持按数字排序。

有人解决了吗?我觉得这与此处描述的问题类似:NSSortDescriptor not being called

至于MR_requestAllSortedBy,在MagicalRecord,实现如下:

+ (NSFetchRequest *) MR_requestAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)context
{
    NSFetchRequest *request = [self MR_requestAllInContext:context];

    NSSortDescriptor *sortBy = [[NSSortDescriptor alloc] initWithKey:sortTerm ascending:ascending];
    [request setSortDescriptors:[NSArray arrayWithObject:sortBy]];

    return request;
}

【问题讨论】:

  • 提供[Child MR_requestAllSortedBy:@"number" ascending:YES withPredicate:[NSPredicate predicateWithFormat:@"parent = %@", self.parent]]; 的代码。那么,为什么首先使用两个不同的描述符(首先按数字,然后按日期)进行排序?你能提供更多关于你的模型的信息吗?谢谢。
  • 对不起。两者都是数字,复制粘贴问题。该模型有两个实体,Parent 和 Child。 Parent 与 Child 是一对多的关系。 Child 上的 number 属性只是一个保留显示顺序的属性——子项可以通过 tableview 编辑重新排序。
  • 请编辑您的问题并在此处插入代码。谢谢。
  • 感谢您编辑您的问题。 NSFetchRequest *request = [self MR_requestAllInContext:context];呢?
  • MR_requestAllSortedBy:ascending:withPredicate: 方法与MR_requestAllSortedBy:ascending:inContext: 方法描述不同?

标签: objective-c ios core-data nsfetchedresultscontroller magicalrecord


【解决方案1】:

所以这是由未保存更改的嵌套 MOC 提取引起的。在执行获取之前使用父 MOC 获取或保存嵌套 MOC 可以解决问题。类似于这个问题中发生的事情:NSSortdescriptor ineffective on fetch result from NSManagedContext

【讨论】:

    【解决方案2】:
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"RemainderDataBase" inManagedObjectContext:[self managedObjectContext]];
        NSSortDescriptor *nameSort = [[NSSortDescriptor alloc]initWithKey:@"title" ascending:YES];
        NSArray *sortDescriptor = [[NSArray alloc]initWithObjects:nameSort, nil];
        fetchRequest.sortDescriptors = sortDescriptor;
        NSPredicate *p1=[NSPredicate predicateWithFormat:@"startdate > %@", [NSDate date]];
        [fetchRequest setPredicate:p1];
        [fetchRequest setEntity:entity];
    

    我想你正在寻找上面的代码..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2011-03-15
      • 2021-12-17
      • 2011-06-14
      • 1970-01-01
      相关资源
      最近更新 更多