4

- (NSFetchedResultsController *)fetchedResultsController从 CoreDataBook 示例开始,我以标准方式在内部有谓词。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"state=%@ && date >= %@ && date < %@", @"1",fromDate,toDate];
    [fetchRequest setPredicate:predicate];

这可以正常工作,但是在编辑项目时,它会返回 NSFetchedResultsChangeDelete 而不是更新。当主视图返回时,它缺少该项目。如果我重新启动模拟器,则删除未保存,并且显示正确的编辑结果,谓词正常工作。

case NSFetchedResultsChangeDelete:
 [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
 break;

我可以通过仅注释掉两个谓词行来确认行为,然后一切正常,因为它应该在编辑和调用 NSFetchedResultsChangeUpdate 而不是 NSFetchedResultsChangeDelete 后正确返回完整集。

我已阅读http://matteocaldari.it/2009/11/multiple-contexts-controllers-delegates-and-coredata-bug 报告类似行为但我没有找到解决我的问题的方法。

4

4 回答 4

6

我也遇到这个问题。根本原因是NSPredicate格式字符串中的attribute的值设置了错误的类型。

对于这个问题,可能是“ state”的属性有一个数字类型,比如“ Integer 32”。但是上面的代码传递了一个 NSString 给 it( @"1"),只要把它改成一个 NSNumber( @1),就可以解决问题了。

Matthew Weiss最终通过使用 fetch request 模板解决了这个问题。我认为在state没有类型问题的模板中检查了“”。并且只有 fromDate 和 toDate 由 subs 传递。

于 2013-09-25T07:03:25.897 回答
1

抱歉,已经有一段时间了,我很快就会发布该产品。解决方法是在获取的对象中创建存储过程并使用

NSFetchRequest *fetch = [model fetchRequestFromTemplateWithName:@"myTemplate1" substitutionVariables:subs];

这消除了在 FetchedResultsController 上使用 Predicate。

当我想使用谓词时,我只需确保我使用的是本地 managedObjectContext 并将数组本身传递给其他地方。 NSArray *array = [moc executeFetchRequest:fetchRequest error:&error]; return array;

这是一个更安全的选择,允许您对相同的数据进行多次查看。

于 2010-05-10T11:04:00.093 回答
0

在我的帖子中,我正在处理NSFetchedResultsController(参见https://devforums.apple.com/message/139580#139580)中的一个已知错误,它在两个不同的托管对象上下文中的两个对象之间进行指针比较,而不是评估objectID,所以我认为这不是你的问题。

date仅当您在指定的时间间隔之外修改对象NSPredicate或进行任何其他修改时,您的对象是否被视为已删除?

于 2010-05-10T08:58:25.923 回答
0

你用的不止一个NSManagedObjectContext吗?您链接到的帖子不正确地使用了多个NSManagedObjectContext实例,这是他问题的根源。这不是他的错误,NSFetchedResultsController而是他对它如何工作的误解。

关于您的问题;case第一个问题:在你展示的那个之前你有休息吗?

编辑代码是什么样的?您显示了一个谓词,但没有显示正在编辑您声明的导致NSFetchedResultsChangeDelete触发的对象的代码。

于 2010-05-10T05:09:49.747 回答