使用Core Data和NSFetchedResultsControllers在使用TableViewControllers搜索后添加新条目时iOS应用程序崩溃

时间:2014-02-19 12:25:44

标签: ios core-data uisearchbar nspredicate nsfetchedresultscontroller

我的应用程序面临一个有趣的问题。首先,应用程序的前提很简单:一个表视图控制器,导航栏中有一个加号按钮;用户按下加号,视图控制器以模态方式显示。用户添加名称,数量和事件,按保存并通过NSFetchedResultsController和Core Data,该信息成功填充在表视图控制器中。

效果很好。 TableViewController也使用SearchBar,以便用户可以在表视图中搜索名称或事件。

问题是:

如果用户在表格视图中搜索条目(并且未取消搜索),然后按添加按钮添加条目,填写信息并按保存,应用程序崩溃时出现以下错误:

CoreData: error: Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet. with userInfo (null)
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet.'

但是,如果用户确实从表视图中取消了搜索,然后添加了新条目,则不会崩溃。这是我需要解决的问题,因为在添加新条目之前,某些工作流可能看不到取消搜索的需要。

表视图中的NSFetchedResultsController具有以下谓词:

if ([self.timelineSearchBar.text length] > 0) {
    NSPredicate *predName = [NSPredicate predicateWithFormat:@"ANY whoBy.name CONTAINS[c] %@", self.timelineSearchBar.text];
    NSPredicate *predOccasion = [NSPredicate predicateWithFormat:@"ANY occasion.title CONTAINS[c] %@", self.timelineSearchBar.text];

    // creating the orCompoundPredicate for the two conditions
    NSPredicate *compPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predName, predOccasion, predDate]];
    [fetchRequest setPredicate:compPredicate];
}

我理解发生了什么,但我不完全确定如何修复它。错误似乎很常见,并且有很多修复,都与稍微调整谓词有关,但我不确定采用哪个方向。

我正在添加我的模型视图以获取更多信息。

enter image description here 对此的任何帮助都将受到大力赞赏。

编辑:我通过故事板而不是代码呈现视图控制器,但根据TheEye的评论,实际上只需清除代码中的搜索并手动呈现视图控制器可能更容易。我正在考虑将此作为一种前进方式进行探索。

1 个答案:

答案 0 :(得分:5)

如果“ANY”与 to-one 关系一起使用而不是 to-many ,则会出现此错误 关系。例如,如果“场合”是一对一的关系,那么你必须这样做 取代

@"ANY occasion.title CONTAINS[c] %@"

通过

@"occasion.title CONTAINS[c] %@"

在第二个谓语中。