NSManagedObjectContext 保存方法抛出异常

Posted

技术标签:

【中文标题】NSManagedObjectContext 保存方法抛出异常【英文标题】:NSManagedObjectContext save method throws exception 【发布时间】:2012-05-11 04:12:59 【问题描述】:

我查看了所有报告 managedObjectContext save: 问题的帖子 但是,我没有找到任何似乎可以解决我所看到的问题的东西。大多数人在协调他们的 FRC 与 tableView 时遇到问题。这是不同的。

当我在 NSManagedObjectContext 实例上调用 save 时,问题就暴露出来了。捕获并记录异常读取:“无法使用非集合对象执行集合评估”。有谁知道这可能意味着什么?

    @try 
        if ([self.managedObjectContext hasChanges]) 
            @synchronized(managedObjectContext) 
                if(![managedObjectContext save:&error]) 
                    NSLog(@"\n\n---------UNRESOLVED ERROR--------------\n\n UserInfo: \n%@, %@", error, [error userInfo]);
                    [self.managedObjectContext rollback];
                
            
        
    
    @catch (NSException *exception) 
        NSLog(@"\n\n---------UNRESOLVED ERROR--------------\n\n exception: \n%@\n%@", exception, error);
    

我唯一的线索是这个问题的可重复性。这发生在我取消保留的 fetchedResultsController 访问器之后,然后使用一组谓词实例化一个新的访问器。

        if(searchFetchedResultsController) 
            self.searchFetchedResultsController = nil;
        

        self.searchFetchedResultsController = [predicateBuilder createSearchInContext:managedObjectContext forDelegate:self withSortDescriptors:self.sortDescriptors forEntityName:@"Record"];

        NSError *error = nil;
        [self.searchFetchedResultsController performFetch:&error];

        if(error)
            NSLog(@"\nfetch error: %@", error);

稍后我将通过使用正常的访问器构造来保留一个没有谓词的新 NSFetchedResultsController。

        if(fetchedResultsController) 
            self.fetchedResultsController = nil;
        

        NSError *error = nil;
        if (![self.fetchedResultsController performFetch:&error]) 
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        

稍后我会添加一个 Record managedObject;节省;并遇到保存抛出的异常。

有趣的是,这种情况每次都会发生,而且只有在我的谓词查询数字或日期时才会发生。它确实不会在查询字符串时发生。所以,我认为我的查询构造似乎是唯一的区别。事实是,两者都在创建有效的谓词(通过 SUBQUERY),因为 fetch 不会失败。所以,如果有区别,我无法告诉你它可能是什么。

其他值得注意的事情是我“分配”一个 FRC 的每个地方,它看起来像这样:

[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];

注意 nil cacheName 和 sectionNameKeyPath

我使用两个指针来阐明我的谓词 FRC 和非谓词 FRC。我知道如果我不提它会惹恼某人。

-(void) setSearchFilteredNames:(BOOL)boolValue 
    searchFilteredNames = boolValue;
    if(boolValue) 
        self.searchFetchedResultsController.delegate = self;
        self.fetchedResultsController.delegate = nil;
        //self.fetchedResultsController = nil; //lazy regeneration
     else 
        self.searchFetchedResultsController.delegate = nil;
        //self.searchFetchedResultsController = nil; //lazy regeneration
        self.fetchedResultsController.delegate = self;
    

另外,当我捕捉到异常时,新对象会被持久化。

【问题讨论】:

【参考方案1】:

我想我工作太晚了……

据我所知,当数据模型中感兴趣的属性的关键路径中没有对多关系时,使用 SUBQUERY 填充 NSPredicates 是不好的做法。

这真的很令人困惑,因为搜索仍然会执行,并返回我预期的结果。直到我添加了一个带有与我的 SUBQUERY 谓词无关的 FRC 的新托管对象之后,问题才显现出来。

我希望这对某人有所帮助...

【讨论】:

非常感谢您的回答,它对我帮助很大。对搜索最初执行但在添加/删除时崩溃的原因感到非常困惑。尤达曼 @Josh O'Connor 很高兴为您提供帮助。我只能希望 CoreData 在我挖掘这些战壕后变得更好。你的评论没有那么多建议。事后看来,我应该直接使用 SQLite ......我会在那里咬我的舌头。

以上是关于NSManagedObjectContext 保存方法抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 多 NSManagedObjectContext 保存通知说明

私有队列 NSManagedObjectContext 在无限循环中保存结束

用于保存的 NSManagedObjectContext 进度表?

NSManagedObjectContext 保存方法抛出异常

保存时的 NSManagedObjectContext 层次结构

iOS - 核心数据 - NSManagedObjectContext - 不确定是不是保存