2012-02-23 7 views
1

NSPersistentDocumentのサブクラスで、writeSafelyToURL:ofType:forSaveOperation:error:を実装しようとしています。私は実質的にSQLiteストアの複製操作であるNSAutosaveElsewhereOperation条件を処理する必要があります。SQLiteストアを複製する

次のコードは、重複したストアを作成する際に問題がありますが、実際にはストアは空であり、理由がわかりません。私は "Revert Document"オプションを使用したときに問題に気付きましたが、 "Duplicate"メニュー項目を使ってみると明らかになりました。

基本的には、現在のストアを削除しようとしているため、保存されません。次に、一時ストアを追加し、コンテキストを保存し、一時ストアを削除し、元のストアを追加し直します。

if (inSaveOperation == NSAutosaveElsewhereOperation) { 
    NSPersistentStoreCoordinator *coordinator = [[self managedObjectContext] persistentStoreCoordinator]; 
    id tempStore = [coordinator addPersistentStoreWithType:@"SQLite" configuration:nil URL:storeURL options:nil error:outError]; 
    success = (tempStore != nil); 
    id originalStore = [coordinator persistentStoreForURL:originalStoreURL]; 
    success = success && 
     [coordinator removePersistentStore:originalStore error:outError]; 

    success = success && 
     [[self managedObjectContext] save:outError]; 

    // restore original store 
    success = success && 
     [coordinator removePersistentStore:tempStore error:outError]; 
    success = success && 
     [self configurePersistentStoreCoordinatorForURL:originalStoreURL ofType:inTypeName modelConfiguration:nil storeOptions:nil error:nil]; 
+0

NSAutosaveElsewhereOperationについての私の現在の理解は、重複ではありません。ドキュメントがまだ場所を持っていない限り、自動保存の後に起こります。 現時点では、これが発生した2つの使用例があります。(1)まだ保存されていない新しい文書の後、(2)既存文書の複製後 – Stephan

答えて

0

これは、読み取り専用になるアプリケーションフォルダーにストアを表示しようとするためです。 ドキュメントフォルダを切り替える必要があると思います。

NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
+0

これは間違いなくアプリケーションフォルダではありません。私は/ private/var/folders/4z/7bzwcw5915g29x1363xhhfm40000gp/T/TemporaryItemsのようなものを印刷するNSLogコードを持っています inSaveOperationはAutoSaveによって起動されるため、場所を選択しません。 –