0

私は何年にもわたって Core Data を扱ってきました。現在、UIManagedDocument について詳しく知りたいと思っています。それについてもっと学ぶために、いくつかのサンプルプロジェクトを行いました。最後に、このメカニズムを実際のプロジェクトに移すことができます。既存のプロジェクトでは、現在 Core Data を実装しているので、Data Model (アプリと同じ名前) を作成しました。エンティティのクラスを生成してから、データベースにオブジェクトを追加するための簡単な方法を持つカテゴリを作成しました。最後に、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'

興味深いことに、最初の実行時にのみクラッシュしますが、このクラッシュのために永続ストレージが作成されないため、ドキュメントなどに書き込むことができません。このコードを使用しているプロジェクトがあります。 、例外をスローしないため、永続ストアが作成され、このドキュメントに書き込むことができます。

どこが間違っていますか?

前もって感謝します!

4

1 に答える 1

0

問題解決!このカテゴリを削除するか、メソッドの名前を変更すると、NSURL を拡張するカテゴリがあり、メソッド baseURL が 1 つしかありません。すべて正常に動作します。

于 2013-03-28T15:12:29.847 に答える