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

标签 ios objective-c macos cocoa core-data

如果核心数据损坏,在某些情况下,当用户打开 .sqlite 文件并进行一些无效更改时,可能会发生这种情况。

我收到以下警报消息(该消息来自内部框架或操作系统,我不知道):

enter image description here

我设置了断点,在此警报之后控件将转到以下方法。这里的 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 中可能不会发生与上述情况非常相似的情况,但会有一些其他消息。

最佳答案

我找到了答案:)

我删除了以下自动生成方法内的[[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;
}

关于ios - 当核心数据文件损坏时如何绕过警报消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24267690/

相关文章:

ios - ReactiveCocoa : sendNext to a subscriber in asynchronous programming

objective-c - 程序化屏幕截图歪曲了最近邻

java - 如何在 OSX 上从 Java 访问网络路径?

IOS - 位置更新不会阻止我的应用程序被终止

ios - 如何在应用程序启动时自动隐藏 iOS 权限警报?

ios - Cordova/Phonegap iOS 解析推送插件

ios - 无法获取tableView的contentOffset

ios - 将 Objective-C malloc 转换为 Swift

macos - 观察新的系统通知 OSX

macos - Mac OSX cocoa 应用程序 : Is it possible to allow your App to use the san francisco font (one used for Apple Watch)?