我正在为一款基于CoreData的应用程序实现手动触发的迁移过程。在成功完成迁移后,我尝试使用
问题是,在iOS上,无论我做什么,这个方法都不会返回YES,但它也从不将任何内容放入错误指针中,以便让您了解出了什么问题。
我曾经阅读到其他地方的文章(例如 http://www.cocoabuilder.com/archive/cocoa/287790-nsdoc-magic-file-watcher-ruins-core-data-migration.html)表明,在尝试替换之前不关闭所有CoreData对象(例如NSMigrationManager、NSManagedObjectModel等)可能是原因,但事实并非如此。我甚至实现了一个小型的创建和交换文件的操作,根本不涉及CoreData数据库,以验证CoreData的东西与此无关。
然后我注意到在官方文档中,
那也不起作用!我最终回退到使用单独的操作实现替换逻辑,但这是非原子和不安全的,所有坏的东西都在那里。
有没有人有运行在iOS上并从调用
非常感谢任何帮助。
编辑-测试代码包含在下面。这在主线程的
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数据库,以验证CoreData的东西与此无关。
然后我注意到在官方文档中,
newitemURL
应该位于被视为临时文件的目录中。我假设这意味着使用NSItemReplacementDirectory
作为搜索路径的URLForDirectory:inDomain:appropriateForURL:create:error:
返回的目录。那也不起作用!我最终回退到使用单独的操作实现替换逻辑,但这是非原子和不安全的,所有坏的东西都在那里。
有没有人有运行在iOS上并从调用
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
URLForDirectory:etc:
之后,tmpDir
的值为nil,因此u2
也是nil,而调用replaceItemAtURL:etc:
导致应用程序崩溃。你到底在做什么?这段代码行不通。 - Tom Harringtonrename()
函数有什么问题吗? - tc.