【发布时间】:2011-06-21 10:34:20
【问题描述】:
我正在为基于 CoreData 的应用程序实施手动触发的迁移过程,并且在迁移成功完成后,我正在尝试使用 replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error: 将迁移的数据库移回原始数据库的顶部。
问题在于,在 iOS 上,我所做的任何事情都不会让这个方法返回 YES,但它也不会在错误指针中放入任何内容以让您查看发生了什么问题。
我在其他地方读过一些东西(例如http://www.cocoabuilder.com/archive/cocoa/287790-nsdoc-magic-file-watcher-ruins-core-data-migration.html),表明在尝试替换之前没有关闭所有 CoreData 对象(例如 NSMigrationManager、NSManagedObjectModel 等)可能是原因,但事实并非如此。我什至实现了一点不涉及 CoreData DB 的两个文件创建和交换的东西,以验证 CoreData 的东西与它没有任何关系。
然后我在official documentation 中注意到newitemURL 应该位于被认为适合临时文件的目录中。我假设这意味着URLForDirectory:inDomain:appropriateForURL:create:error: 返回的目录使用NSItemReplacementDirectory 作为搜索路径。
那也没用!我最终退回到使用单独的操作来实现替换逻辑,但这是非原子的、不安全的以及所有这些坏东西。
有没有人有一个在 iOS 上运行的有效的 sn-p 代码,它要么从对 replaceItemAtURL 的调用中返回 YES,要么实际上将错误信息放入错误指针中?
非常感谢任何帮助。
编辑 - 下面包含测试代码。这在主线程的application:didFinishLaunchingWithOptions: 中运行。
NSFileManager *fm = [[NSFileManager alloc] init];
NSError *err = nil;
NSURL *docDir = [NSURL fileURLWithPath:[self applicationDocumentsDirectory]];
NSURL *tmpDir = [fm URLForDirectory:NSItemReplacementDirectory
inDomain:NSUserDomainMask
appropriateForURL:docDir
create:NO
error:&err];
NSURL *u1 = [docDir URLByAppendingPathComponent:@"f1"];
NSURL *u2 = [tmpDir URLByAppendingPathComponent:@"f2"];
NSURL *repl = nil;
[fm createFileAtPath:[u1 path]
contents:[[NSString stringWithString:@"Hello"]
dataUsingEncoding:NSUTF8StringEncoding]
attributes:nil];
[fm createFileAtPath:[u2 path]
contents:[[NSString stringWithString:@"World"]
dataUsingEncoding:NSUTF8StringEncoding]
attributes:nil];
BOOL test = [fm replaceItemAtURL:u1 withItemAtURL:u2 backupItemName:@"f1backup"
options:0 resultingItemURL:&repl error:&err];
// At this point GDB shows test to be NO but error is still nil
【问题讨论】:
-
已在 Jonathan 上方添加代码 - 任何输入表示赞赏。
-
我遇到了同样的问题。我尝试将 newItemURL 指向的创建文件放在与
NSTemporaryDirectory()和NSCachesDirectory对应的目录中,但它仍然失败而没有任何错误。你有运气吗? -
很遗憾没有。我最终只是通过自己实现它来解决它,这真的很糟糕。
-
resultingItemURL 真的可以为零吗?文档中没有这样说。
-
我在 iOS 6 上运行了这段代码,它可以工作(返回 YES)。所以这可能是自 iOS 4 以来已解决的错误。
标签: iphone core-data ios-4.2 nsfilemanager