iOS 5.1:在 NSManagedObjectContext 保存时获取“CoreData:错误:(21)”

Posted

技术标签:

【中文标题】iOS 5.1:在 NSManagedObjectContext 保存时获取“CoreData:错误:(21)”【英文标题】:iOS 5.1: Getting "CoreData: error: (21)" on NSManagedObjectContext save 【发布时间】:2012-03-06 16:10:23 【问题描述】:

我收到了一个应用程序,它可以显示 PDF,并在关闭 PDF 时存储旋转角度和缩放状态。

我遇到的症状是在[NSManagedObjectContext save] 我得到:

CoreData:错误:(21) 数据库的 I/O 错误 db 路径 SQLite 错误代码:21,“无法打开数据库文件” 2012-03-06 09:58:40.227 Navtech iCharts[59838:fb03] 操作无法完成。 (Cocoa 错误 21。)

这只会在大约 225-250 次保存后发生。发生后,应用程序甚至无法打开.nib文件,从而导致:

'NSInternalInconsistencyException',原因:'无法在包中加载 NIB

我查阅了有关错误的sqlite文档,发现只有标题:

#define SQLITE_MISUSE      21   /* Library used incorrectly */

我什至不确定从哪里开始诊断。有谁知道是什么导致这种情况如此频繁地发生?


关于上下文,这里是执行保存的代码:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(managedObjectContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:self.context];
NSError *err = nil;
@synchronized(self)

    if (![self.context save:&err])
    
        NSLog(@"%@", [err localizedDescription]);
    

[[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:self.context];

【问题讨论】:

【参考方案1】:

您可能用完了文件描述符。您是否(直接和/或间接)打开了很多文件?

也看看this question。

【讨论】:

我们直接打开了很多文件(不确定是否间接)。几百年前的错误发生。也许我们没有正确发布它们。我会看看。谢谢 您应该尝试限制这一点。您可以打开的文件数量有硬性限制。 我们一直在使用一堆fopens。我没有机会确定我们是否正确地发布了它们,因为另一位开发人员同时删除了带有流的fopens。这无疑为您的假设提供了很大的分量。

以上是关于iOS 5.1:在 NSManagedObjectContext 保存时获取“CoreData:错误:(21)”的主要内容,如果未能解决你的问题,请参考以下文章

如何在Swift中初始化iOS 10和iOS 9.3的NSManagedObject子类

如何在 Swift 中为 iOS 10 和 iOS 9.3 初始化 NSManagedObject 子类

如何使用尚未保存在 iOS 中的 objectID 访问 NSManagedObject 实体?

iOS 管理域模型和 NSManagedObject 模型

iOS NSDate 和 NSManagedObject

iOS 8 Swift:使用 segue 编辑 NSManagedObject:声明类型时出错