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

时间:2014-06-17 15:24:42

标签: 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上面那样发生,但会有其他消息。

1 个答案:

答案 0 :(得分:3)

我找到答案:)

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