NSIncrementalStore:从这个 NSManagedObjectContext 的协调器无法访问对象的持久存储

Posted

技术标签:

【中文标题】NSIncrementalStore:从这个 NSManagedObjectContext 的协调器无法访问对象的持久存储【英文标题】:NSIncrementalStore: Object's persistent store is not reachable from this NSManagedObjectContext's coordinator 【发布时间】:2014-01-14 19:50:17 【问题描述】:

我正在尝试实现一个 NSIncrementalStore,它将通过 RPC API 访问服务器。它需要在本地缓存所有数据,因此我首先创建了一个 NSIncrementalStore 以使用另一个用作缓存的核心数据堆栈。

首先我设置元数据并设置缓存将使用的核心数据堆栈。缓存SQL文件是store初始化时传入的URL:

    - (BOOL)loadMetadata:(NSError *__autoreleasing *)error 

NSMutableDictionary *mutableMetadata = [NSMutableDictionary dictionary];
[mutableMetadata setValue:[[NSProcessInfo processInfo] globallyUniqueString] forKey:NSStoreUUIDKey];
[mutableMetadata setValue:RTkCachedAPIStoreType forKey:NSStoreTypeKey];
//[mutableMetadata setValue:NSStringFromClass([self class]) forKey:NSStoreTypeKey];
[self setMetadata:mutableMetadata];

// Set up the Cache Stack
NSManagedObjectModel *model = [self.persistentStoreCoordinator.managedObjectModel copy];
self.cacheModel = model;

self.cachePersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.cacheModel];

self.cacheContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

NSURL *storeURL;
if ([self.URL isFileURL]) 
    storeURL = self.URL;


NSError *storeAddError = nil;
if (![self.cachePersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                        configuration:nil
                                                                  URL:storeURL
                                                              options:nil
                                                                error:&storeAddError]) 
    NSLog(@"Fatal error while creating persistent store: %@", storeAddError);
    abort();


[self.cacheContext setPersistentStoreCoordinator:self.cachePersistentStoreCoordinator];

return YES;

对实体的简单请求的执行请求类似于以下代码。本质上,我只是接受请求,将其包装为 FetchRequest 并在缓存核心数据堆栈上执行请求。然后,我在调用上下文中使用返回的 objectID 创建对象:

- (id)executeRequest:(NSPersistentStoreRequest *)request withContext:(NSManagedObjectContext *)context error:(NSError *__autoreleasing *)error 

if ([request requestType] == NSFetchRequestType) 
    NSFetchRequest *fetchRequest = (NSFetchRequest *)request;
    NSEntityDescription *entity = [fetchRequest entity];

    NSFetchRequest *cacheFetchRequest = [[NSFetchRequest alloc] init];
    cacheFetchRequest.entity = entity;
    __block NSArray *fetchedObjectFromCache;
    [self.cacheContext performBlockAndWait:^()
        fetchedObjectFromCache = [self.cacheContext executeFetchRequest:cacheFetchRequest error:error];
    ];
    NSMutableArray *fetchedObjects = [NSMutableArray arrayWithCapacity:[fetchedObjectFromCache count]];
    for (NSManagedObject *anObject in fetchedObjectFromCache) 
        NSManagedObjectID *objectID = anObject.objectID;
        NSManagedObject *managedObject = [context objectWithID:objectID];
        [fetchedObjects addObject:managedObject];
    
    return fetchedObjects;


当我尝试这个时,它会抛出异常并出现错误

<unknown>:0: error: -[] : Object's persistent store is not reachable from this NSManagedObjectContext's coordinator

在线NSManagedObject *managedObject = [context objectWithID:objectID]; 我不知道为什么会这样 - 这是苹果建议在文档中完成的确切方式!

这个错误似乎与跨线程访问上下文有关——但我没有这样做。 关于这里有什么问题的任何建议?

【问题讨论】:

【参考方案1】:

您使用了错误的 objectID。

缓存中的 objectID 与持久存储的 objectID 不匹配,因为增量存储没有相同的标识符。

【讨论】:

谢谢!这就是问题所在,正盯着我的脸!

以上是关于NSIncrementalStore:从这个 NSManagedObjectContext 的协调器无法访问对象的持久存储的主要内容,如果未能解决你的问题,请参考以下文章

Python/Pandas:如何从 datetime64[ns] 转换为 datetime

Pandas DataFrame - '不能在使用 ols/线性回归时将日期时间从 [datetime64[ns]] 输入到 [float64]'

从 timestamp[us, tz=Etc/UTC] 转换为 timestamp[ns] 会导致时间戳越界

使用 XSL 从 CDATA 转换 XML

iOS - 系统方法中弃用的关键字的了解 NS_AVAILABLE和NS_DEPRECATED

从命令行使用 psql 时的单引号