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。
【讨论】:
我们直接打开了很多文件(不确定是否间接)。几百年前的错误发生。也许我们没有正确发布它们。我会看看。谢谢 您应该尝试限制这一点。您可以打开的文件数量有硬性限制。 我们一直在使用一堆fopen
s。我没有机会确定我们是否正确地发布了它们,因为另一位开发人员同时删除了带有流的fopen
s。这无疑为您的假设提供了很大的分量。以上是关于iOS 5.1:在 NSManagedObjectContext 保存时获取“CoreData:错误:(21)”的主要内容,如果未能解决你的问题,请参考以下文章
如何在Swift中初始化iOS 10和iOS 9.3的NSManagedObject子类
如何在 Swift 中为 iOS 10 和 iOS 9.3 初始化 NSManagedObject 子类