核心数据文件损坏时如何绕过警报消息?
Posted
技术标签:
【中文标题】核心数据文件损坏时如何绕过警报消息?【英文标题】:How to bypass alert message when core data file is corrupted? 【发布时间】:2014-06-17 15:24:42 【问题描述】:如果核心数据损坏,在某些情况下可能会发生这种情况,因为用户打开 .sqlite 文件并进行了一些无效的更改。
我收到以下警报消息(来自内部框架或操作系统,我不知道):
我设置了断点,在此警报之后,控件转到以下方法。这里dict
设置了一些文本,再次作为警报显示给用户。
我评论了一些语句并添加了一个方法deleteAll
,它会静默删除所有三个文件。
- (NSManagedObjectContext *)managedObjectContext //1
if (_managedObjectContext)
return _managedObjectContext;
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator)
// NSMutableDictionary *dict = [NSMutableDictionary dictionary];
// [dict setValue:@"Failed to initialize the store. \n\nResetting..." forKey:NSLocalizedDescriptionKey];
// [dict setValue:@"There was an error building up the data file." forKey:NSLocalizedFailureReasonErrorKey];
// NSError *error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
// [[NSApplication sharedApplication] presentError:error];
[self deleteAll];
return nil;
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
-(void)deleteAll
NSURL *url = [self applicationFilesDirectory];
NSArray *files = @[@"CoreDataInput.sqlite", @"CoreDataInput.sqlite-shm", @"CoreDataInput.sqlite-wal"];
for (NSString *file in files)
NSURL *tempUrl =[url URLByAppendingPathComponent:file];
NSLog(@"url is : %@", tempUrl);
NSError *error;
[[NSFileManager defaultManager]removeItemAtURL:tempUrl
error:&error];
在此之后,我再次创建核心数据文件。到目前为止一切顺利。
我的要求是不显示上述警告/警报。如何删除该警告,是否有任何 API / 通知等可以绕过它。
这在 OSX 中可能不会像上面那样发生,但会有一些其他消息。
【问题讨论】:
[self persistentStoreCoordinator] 中有什么? @jimpic:那是自动生成的代码,你可以创建一个coredata项目并检查。然而,它这样做 返回应用程序的持久存储协调器。此实现创建并返回一个协调器,并将应用程序的存储添加到它。 (如有必要,将创建商店的目录。) 【参考方案1】:我找到了答案:)
我删除了以下自动生成的方法中的 [[NSApplication sharedApplication] presentError:error];
语句。现在,即使文件未找到或已损坏,它也会默默地创建一个新文件。当然,所有数据都被删除了,因为我不想要它们。
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
...
if (!ok)
//[[NSApplication sharedApplication] presentError:error];
return nil;
else
if (![properties[NSURLIsDirectoryKey] boolValue])
...
//[[NSApplication sharedApplication] presentError:error];
return nil;
...
//[[NSApplication sharedApplication] presentError:error];
return nil;
_persistentStoreCoordinator = coordinator;
return _persistentStoreCoordinator;
【讨论】:
以上是关于核心数据文件损坏时如何绕过警报消息?的主要内容,如果未能解决你的问题,请参考以下文章
己亥清爽恢复系列之数据文件3篇:非核心数据文件物理损坏或丢失(无备份恢复)