Работя с Core Data от години. В момента бих искал да науча повече за UIManagedDocument. Направих няколко примерни проекта, за да науча повече за това. И накрая, добре е да прехвърля този механизъм към реалните проекти. В съществуващия проект в момента внедрявам основните данни, така че създадох модела на данни (със същото име като приложението). Генерирах клас за обект, след което създадох категория, която има прост метод за добавяне на обекти към базата данни. Най-накрая създадох сингълтона за 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.");
}
}
След като инстанцирам споделен екземпляр и извикам метода pripraveManagedDocument, той се срива с това съобщение:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString _cfurl]: unrecognized selector sent to instance 0xb3774b0'
Интересното е, че се срива само при първото стартиране, но поради този срив няма да създаде постоянно хранилище, така че няма да може да пише в документа и т.н. Имам проект, който работи с този код и не хвърляйте никакви изключения, следователно създава постоянно хранилище и мога да пиша в този документ.
Къде греша?
Благодаря предварително!