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

这是我在这个问题上的两分钱。我尝试了 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 回答