1

我有一个使用 Core Data 进行存储的 iphone 应用程序。我已经成功部署了它,现在我正在开发第二个版本。我遇到了数据模型的问题,在升级持久存储时需要进行一些非常简单的数据转换,所以我不能只使用默认的推断映射模型。

我的对象模型存储在 .xcdatamodeld 包中,版本 1.0 和 1.1 彼此相邻。版本 1.1 设置为活动版本。当我使用默认迁移行为并将 NSInferMappingModelAutomaticallyOption 设置为 YES 时,一切正常。我的 sqlite 存储从模型的 1.0 版本升级,一切都很好,当然,除了我需要做的一些转换。

作为一个额外的实验步骤,我在核心数据模型包中添加了一个新的映射模型,并且没有对 xcode 生成的内容进行任何更改。当我运行我的应用程序(使用旧版本的数据存储)时,我得到以下信息

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object's persistent store is not reachable from this NSManagedObjectContext's coordinator'

我究竟做错了什么?这是我获取托管对象模型和持久存储协调器的代码。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"gti_store.sqlite"]];

    NSError *error;
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                                   configuration:nil 
                                                             URL:storeUrl 
                                                         options:options 
                                                           error:&error]) {
        NSLog(@"Eror creating persistent store coodinator - %@", [error localizedDescription]);
    }    

    return _persistentStoreCoordinator;
}


- (NSManagedObjectModel *)managedObjectModel {

    if(_managedObjectModel == nil) {

        _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
        NSDictionary *entities = [_managedObjectModel entitiesByName];

        //add a sort descriptor to the 'Foo' fetched property so that it can have an ordering - you can't add these from the graphical core data modeler
        NSEntityDescription *entity = [entities objectForKey:@"Foo"];   
        NSFetchedPropertyDescription *fetchedProp = [[entity propertiesByName] objectForKey:@"orderedBar"];
        NSSortDescriptor* sortDescriptor =  [[[NSSortDescriptor alloc] initWithKey:@"index" ascending:YES] autorelease];
        NSArray* sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
        [[fetchedProp fetchRequest] setSortDescriptors:sortDescriptors];
    }
    return _managedObjectModel;
}
4

4 回答 4

5

我没有仔细考虑这一点,这只是一个观察,因为我遇到了同样的问题,而且我在网上也发现很少有关于这个错误的参考。

在我的情况下,问题是我已经设置了我的应用程序的一个对象来观察

NSManagedObjectContextObjectsDidChangeNotification 像这样

        [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(observeContextSave:)
                                                 name:NSManagedObjectContextDidSaveNotification
                                               object:nil];


- (void) observeContextSave:(NSNotification*) notification {
[[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];}

一旦我移动了这段代码,以便在迁移后执行,错误就消失了。

反正。我敢肯定你的情况是不同的。但考虑一下您对来自 managedObjectContext 的通知设置了哪些观察结果可能会有所帮助。

更新:考虑到这一点,我猜这是因为在迁移过程中创建了多个持久存储,这意味着 NSManagedObjectContextDidSaveNotification 将从具有不同持久存储的上下文发送到发送 mergeChangesFromContextDidSaveNotification 的上下文。

于 2010-04-26T07:02:40.673 回答
4

首先,如果您有映射模型,请关闭自动迁移,它们很有可能发生冲突。完成此操作后,请确认错误已消失。

于 2010-03-16T19:36:37.120 回答
0

当从辅助线程执行持久存储初始化时,我遇到了类似的问题。在我在主线程中强制初始化后,问题就消失了。奇怪的。

于 2010-09-20T13:36:58.603 回答
0

似乎你已经把它修好了,但值得一提。我也有这个错误,原因是我有多个 MOC 被通知,mergeChangesFromContextDidSaveNotification而它们有不同的持久存储(或不同的模式)。他们不知道如何处理不属于他们商店的变更。

于 2013-01-23T21:34:24.773 回答