2

UIManagedDocument を削除する正しい手順、特に iCloud オプションがオンになっている手順を説明する信頼できるドキュメントが見つからないようです。

このオプションを選択すると、この fileURL のファイルが削除されることを理解しています。そして、iCloud が使用されていない場合、これは問題ないように思われます。

[[NSFileManager defaultManager] removeItemAtURL:fileURL error:&error];

iCloud が使用されている場合、CoreData は、/Document/CoreDataUbiquitySupport や iCloud の /CoreData フォルダーなど、あらゆる場所にファイルを作成します。したがって、この場合、を呼び出す前にremoveUbiquitousContentAndPersistentStoreAtURL各ストアを呼び出すのは私次第です。もしそうなら、これはどこかに文書化されていますか?UIManagedDocument[NSFileManager removeItemAtURL]

[NSPersistentStoreCoordinator removeUbiquitousContentAndPersistentStoreAtURL:storeURL
                                                                     options:@{NSPersistentStoreUbiquitousContentNameKey:fileName,
   NSMigratePersistentStoresAutomaticallyOption:@YES,
         NSInferMappingModelAutomaticallyOption:@YES,
                          NSSQLitePragmasOption:@{ @"journal_mode" : @"DELETE" }}
                                                                       error:&error];
4

2 に答える 2

2

これがこの問題に関する私の2セントです。私は dtrotzjr が推奨するものを試しましたが、あまり成功しませんでした。removeUbiquitousContentAndPersistentStoreAtURL:options:error: は UIManagedDocument のデータを消去するのに最適なようですが、Logs フォルダーはまだそこにあり、削除しようとしているファイルの残りもそうです。以下は、iCloud またはローカル ドキュメントから UIManagedDocument を完全に削除する簡単な方法です。

+ (void)deleteDocumentURL:(NSURL *)url{
    //if we have an iCloud Document, remove it from the UbiquitouseKeyValueStore
    if ([self isiCloudURL:url]) {
        [[NSUbiquitousKeyValueStore defaultStore] removeObjectForKey:[url lastPathComponent]];
    }

    //do the delete on another thread
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
        NSError *coordinationError;

        [coordinator coordinateWritingItemAtURL:url
                                    options:NSFileCoordinatorWritingForDeleting
                                      error:&coordinationError
                                 byAccessor:^(NSURL *newURL) {
         NSError *removeError;
        //code for performing the delete
        [[NSFileManager defaultManager] removeItemAtURL:newURL error:&removeError];

        //if we have an iCloud file...
        if ([self isiCloudURL:url]) {
            //remove log files in CoreData directory in the cloud
            NSURL *changeLogsURL = [[self urlForiCloudLogFiles] URLByAppendingPathComponent:[url lastPathComponent]];
                [[NSFileManager defaultManager] removeItemAtURL:changeLogsURL error:&removeError];
            }
        }];
    });
}

これはスタンフォード大学の CS193 コース 2012 のコード + changeLogs フォルダーの削除であり、ローカルおよび iCloud ドキュメントで機能します。この方法で削除を実行する際に問題が発生した場合はお知らせください。

于 2013-12-11T21:12:23.193 に答える
1

iCloudコアデータコンテンツの場合removeUbiquitousContentAndPersistentStoreAtURL:options:error:NSPersistentStoreCoordinatorクラスで静的メソッドを呼び出してから呼び出しますremoveItemAtURL:error:

deleteManagedDocumentWithIdentifier:私のAPManagedDocumentプロジェクトで見てください。これはubiquitous_experiment、マスター ブランチにマージする前に、現在ファイナライズに取り組んでいるブランチにあります。

于 2013-10-09T02:33:14.643 に答える