我正在使用 Core Data 多年。目前我想了解更多关于 UIManagedDocument 的信息。我已经完成了几个示例项目以了解更多信息。最后,我很高兴将这种机制转移到实际项目中。在现有项目中,我目前正在实现Core Data,因此我创建了Data Model(与app同名)。我为实体生成了一个类,然后我创建了一个类别,该类别具有一个将对象添加到数据库的简单方法。最后我为 UIManagedDocument 创建了单例,现在它看起来像这样:
+ (MDManagedDocument *)sharedDocument {
static dispatch_once_t dispatchOncePredicate;
__strong static MDManagedDocument *md = nil;
dispatch_once(&dispatchOncePredicate, ^{
md = [[MDManagedDocument alloc] init];
});
return md;
}
- (id)init {
self = [super init];
if(self) {
[self setManagedDocument:[[UIManagedDocument alloc] initWithFileURL:[[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"ThisIsDatabase"]]];
[[self managedDocument] setPersistentStoreOptions:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]];
}
return self;
}
- (void)prepareManagedDocument {
if (![[NSFileManager defaultManager] fileExistsAtPath:[[[self managedDocument] fileURL] path]]) {
[[self managedDocument] saveToURL:[[self managedDocument] fileURL] forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
if (success) {
NSLog(@"Managed document was created.");
} else {
NSLog(@"Error occured while creating managed document.");
}
}];
} else if([[self managedDocument] documentState] == UIDocumentStateClosed) {
[[self managedDocument] openWithCompletionHandler:^(BOOL success) {
if (success) {
NSLog(@"Managed document was opened.");
} else {
NSLog(@"Error occured while opening managed document.");
}
}];
} else if([[self managedDocument] documentState] == UIDocumentStateNormal) {
NSLog(@"Managed document is opened and prepared for editing and/or reading.");
}
}
在我实例化共享实例并调用 prepareManagedDocument 方法后,它会因以下消息而崩溃:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString _cfurl]: unrecognized selector sent to instance 0xb3774b0'
有趣的是它只在第一次运行时崩溃,但由于这次崩溃,它不会创建持久存储,所以它无法写入文档等。我有一个正在使用此代码的项目,并且不要抛出任何异常,因此它正在创建持久存储并且我能够写入该文档。
我哪里错了?
提前致谢!