轻量级迁移

时间:2013-04-09 22:08:01

标签: objective-c cocoa core-data

在设置基于文档的应用程序方面,我一直在关注Marcus Zarra的指南。到目前为止,它一直进展顺利,但我试图实施核心数据轻量级迁移,我似乎遇到了麻烦。旧版本和新版本模型之间的唯一区别是其中一个实体的NSString属性。

在NSDocument中,我添加了以下代码:

    - (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error
    {
        NSMutableDictionary *newStoreOptions;
        if (storeOptions == nil) {
            newStoreOptions = [NSMutableDictionary dictionary];
        }
        else {
            newStoreOptions = [storeOptions mutableCopy];
        }
        [newStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
        [newStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

        BOOL result = [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newStoreOptions error:error];
        NSLog(@"base url:%@ model:%@", [url baseURL], [self managedObjectModel]);
        return result;
  }

为了看看发生了什么,我输出了从

返回的错误变量
[super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newStoreOptions error:error];

这就是我从Xcode那里得到的:

  NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=512 \"The file couldn\U2019t be saved.\" UserInfo=0x104521930 {NSUnderlyingException=Error validating url for store}";
reason = "Can't add destination store";

我已经看过几篇帖子,因为有些用户在尝试同时读/写时遇到了这个问题,但我不相信我会陷入那个类别。

此外,我不知道这是否有所不同,但我设置我的应用程序有两个上下文。一个是写入persistentStore的根上下文,第二个是子上下文,它是UI发出的所有操作的位置。根上下文被设置为子项的父上下文。

谢谢!

更新 愚蠢的我...我认为我有一个部分解决方案,但不确定这将如何在用户计算机上工作。因此,如果我取消选中“启用应用程序沙盒”#39;在摘要选项卡中,一切似乎都有效。虽然这对我有用,但是当我将它提交到Mac App Store并且不确定这将如何影响用户时,我将不得不打开它。

1 个答案:

答案 0 :(得分:0)

查看configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error的文档,尤其是NSError **参数。您应该传递NSError *的地址,即&error在您的情况下(假设您已在省略的代码中定义NSError *error)。但是&error的价值在成功时是不确定的。使用像

这样的东西
if (!result) {
    NSLog(@"%@", error.localizedFailureReason);
    // fix it
}