首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSIncrementalStore:无法从这个NSManagedObjectContext的协调器访问对象的持久存储

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

Stack Overflow用户
提问于 2014-01-14 19:50:17
回答 1查看 1.5K关注 0票数 0

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

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

代码语言:javascript
复制
    - (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创建对象:

代码语言:javascript
复制
- (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];行,我不知道为什么会这样--这正是苹果建议在文档中这样做的方式!

这个错误似乎与跨线程访问上下文有关--但我没有这样做。对这里出了什么问题有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-14 21:53:09

你用错了objectID。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21122637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档