我从CoreDataBook示例开始以标准方式在- (NSFetchedResultsController *)fetchedResultsController
内部有谓词。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"state=%@ && date >= %@ && date < %@", @"1",fromDate,toDate];
[fetchRequest setPredicate:predicate];
这样可以正常工作,但是在编辑项目时,它会返回NSFetchedResultsChangeDelete而不是Update。当主视图返回时,它缺少该项。如果我重新启动模拟器,则不会保存删除,并且正确的编辑结果会显示谓词正常工作。
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
我可以通过仅注释两个谓词行来确认行为,然后全部工作,因为它应该在编辑和调用NSFetchedResultsChangeUpdate而不是NSFetchedResultsChangeDelete后正确返回完整集。
我看过http://matteocaldari.it/2009/11/multiple-contexts-controllers-delegates-and-coredata-bug 谁报告了类似的行为,但我还没有找到解决问题的方法。
答案 0 :(得分:6)
我也遇到了这个问题。根本原因是由NSPredicate格式字符串中的属性值设置错误类型引起的。
对于此问题,可能是“state
”的属性具有数字类型,例如“Integer 32
”。但上面的代码将NSString传递给它(@"1"
),只需将其更改为NSNumber(@1
),就可以解决问题。
Matthew Weiss 最后通过使用获取请求模板解决了问题。我认为在模板中检查了“state
”,该模板没有类型问题。并且只有fromDate和toDate通过subs传递。
答案 1 :(得分:1)
很抱歉已经有一段时间了,我很快就会发布该产品。解决方法是在获取的对象中创建存储过程并使用
NSFetchRequest *fetch = [model fetchRequestFromTemplateWithName:@"myTemplate1" substitutionVariables:subs];
这消除了在FetchedResultsController上使用Predicate。
当我想使用谓词时,我只是确保我使用的是本地的managedObjectContext并将数组本身传递给其他地方。 NSArray *array = [moc executeFetchRequest:fetchRequest error:&error]; return array;
这是一个更安全的赌注,允许您对相同数据进行多次查看。
答案 2 :(得分:0)
您使用的是多个NSManagedObjectContext
吗?您链接到的帖子使用了多个NSManagedObjectContext
个实例,这是他问题的根源。这不是NSFetchedResultsController
中的错误,而是他对如何运作的误解。
关于你的问题;第一个问题:你在展示之前的case
有休息吗?
编辑代码是什么样的?您显示谓词,但不显示正在编辑您声明导致NSFetchedResultsChangeDelete
触发的对象的代码。
答案 3 :(得分:0)
在我的帖子中,我正在处理NSFetchedResultsController
中的已知错误(请参阅https://devforums.apple.com/message/139580#139580),该错误在两个不同的托管对象上下文中对两个对象进行指针比较,而不是评估objectID
,所以我认为这不是你的问题。
如果您在date
指定的时间间隔内修改其NSPredicate
或进行任何其他修改,您的对象是否会被视为已删除?