核心数据文件损坏时如何绕过警报消息?

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篇:非核心数据文件物理损坏或丢失(无备份恢复)

如何在 JQuery Multifile 中删除警报验证

如何在 Excel 下载时抑制文件损坏警告?

如何修复我的 TortoiseSVN 存储库中的损坏?

DB笔试面试225在Oracle中,如果联机Redo日志文件损坏,那么如何恢复?

jQuery - 如何在显示警报消息后阻止表单发布数据?