NSPredicate导致更新编辑返回NSFetchedResultsChangeDelete而不是NSFetchedResultsChangeUpdate

时间:2010-04-15 14:44:25

标签: core-data predicate

我从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 谁报告了类似的行为,但我还没有找到解决问题的方法。

4 个答案:

答案 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或进行任何其他修改,您的对象是否会被视为已删除?