-1

return 、 return にautosavesInPlace設定されている場合、新しいドキュメントの保存に失敗する NSPersistentDocument ベースのアプリがあり、問題は消えます。YESNO

  • 新しいドキュメントを作成します
  • 変更を加える
  • 保存して実行するNSSaveAsOperationと、ドキュメントの名前と URL が変更され、すべて問題ないように見えますが、次の保存では非常に説明的なメッセージが表示されます。

NSPersistentStoreSaveError = 134030, // unclassified save error - something we depend on returned an error

これは、ドキュメントが の後に保存を実行しようとしたときにのみ発生しますNSSaveAsOperation。他の保存タイプは、既存のドキュメントへの変更と同様に正常に機能します。興味深い効果は、名前や場所を変更しないと、この問題も発生しないことです。

の例外バックトレースを取得しています

フレーム #0: 0x00007fff988143c5 libobjc.A.dylib objc_exception_throw frame #1: 0x00007fff94c5f5f9 CoreData-[NSPersistentStore(_NSInternalMethods) _preflightCrossCheck] + 697 フレーム #2: 0x00007fff94c3198b CoreData -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 603 frame #3: 0x00007fff94c5aa98 CoreData-[NSManagedObjectContext 保存:] + 456 フレーム #4: -[NSPersistentDocument writeToURL:ofType:forSaveOperation:originalContentsURL:error:] + 3743 frame #5: 0x0000000100002de7 ZZZZ0x00007fff91baa101 :error:] + 135 at ZZZZDocument.m:209 frame #6: 0x00007fff91baabc7 AppKit -[NSPersistentDocument writeSafelyToURL:ofType:forSaveOperation:error:] + 611 frame #7: 0x0000000100002ea3 ZZZZ-[ZZZZDocument writeSafelyToURL:ofType:forSaveOperation:error:] + 115 at ZZZZDocument.m:223

何か案は?

4

1 に答える 1

0

ラップされていないコア データ ファイルは使用できません

NSSaveAsOperationその列挙型の永続ストアでトラップして移行を実行しようとすると、...-journalファイルの構築はサンドボックスの外にあるため作成に失敗します。

-(void)saveToURL:(NSURL *)url ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation completionHandler:(void (^)(NSError *))completionHandler
{
    NSLog(@" save op = %ld to %@ ",saveOperation,url);
    NSURL *targeturl = url;

    if(saveOperation == NSSaveAsOperation)
    {
        //migrate pstore
        NSPersistentStore *store = [self.managedObjectContext.persistentStoreCoordinator.persistentStores lastObject];
        if (store)
        {
            NSMutableDictionary *opts = [NSMutableDictionary dictionary];
            [opts setValue:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
            [opts setValue:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];

            NSError *error = NULL;

            NSPersistentStore *newstore =  [self.managedObjectContext.persistentStoreCoordinator migratePersistentStore:store toURL:url options:opts withType:store.type error:&error];

            if(newstore == nil)
            {
                NSLog(@"migration error %@",[error localizedDescription]);
            }

            self.fileURL = url;


        }


    }

    [super saveToURL:targeturl ofType:typeName forSaveOperation:saveOperation completionHandler:completionHandler];
}

そのため、フレームワークを使用して自明ではないバンドル/フォルダーにファイルをラップする必要がありますNSPersistentDocument

ここで待ってNSManagedDocumentいます(それは願い事のAPIです)

于 2012-12-26T11:39:39.347 に答える