ios - 创建持久存储后核心数据错误

标签 ios core-data nsmanagedobjectcontext nspersistentstore

在我的应用程序中,我能够清除数据库中的所有数据。此操作完成后,将解析捆绑的 JSON,然后将其保存到数据库中(以便将数据库返回到默认状态)。解析和保存此 JSON 的操作在任何情况下都可以正常工作,除非在清除并重新创建持久存储之后,在这种情况下我得到“NSInvalidArgumentException”,原因:“无法从此 NSManagedObjectContext 的协调器访问对象的持久存储”。在后台上下文中保存后尝试在我的主线程上下文上调用 mergeChangesFromContextDidSaveNotification 时抛出此异常。

重新创建存储是在主线程上执行的,而解析和保存总是在后台线程上进行。这是我的托管对象上下文的 getter 以确保线程安全:

- (NSManagedObjectContext *)managedObjectContext {

    NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary];
    NSManagedObjectContext *threadContext = threadDictionary[ckCoreDataThreadKey];

    if (!threadContext) {
        threadContext = [self newManagedObjectContext];
        threadDictionary[ckCoreDataThreadKey] = threadContext;
    }

    return threadContext;
}

newManagedObjectContext 方法为所有新实例提供相同的 NSPersistentStoreCoordinator 对象。

这是用于清除存储的代码(始终在主线程上执行):

[self.managedObjectContext lock];
[self.managedObjectContext reset]; //to drop pending changes
                                       //delete the store from the current managedObjectContext
if ([[self.managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[self.managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:error]) {
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:error];

    [[self.managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:error]; //recreates the persistent store

    [self addSkipBackupAttributeToItemAtURL:storeURL];
}

[self.managedObjectContext unlock];

奇怪的是,同样的代码在其他项目中也能正常工作,除了数据内容之外没有任何区别。非常感谢任何帮助!

最佳答案

The "Object's persistent store is not reachable from this NSManagedObjectContext's coordinator"

此消息表示您尝试使用从刚刚删除的数据存储中加载的托管对象。您从协调器中删除了持久存储并删除了存储文件,但您仍然至少有一个从该存储加载的 NSManagedObject。你不能再使用这些对象,因为如果你这样做,你会得到这个特定的异常。确保在第二个代码段中对 Core Data 堆栈进行核处理之前, 摆脱任何现有的托管对象。

至于为什么这在不同的应用程序中有效,很可能是该应用程序没有保留过时的托管对象。

关于ios - 创建持久存储后核心数据错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17622025/

相关文章:

ios - Realm移动平台打造通用 Realm

ios - swift 3 google maps - 如何更新 map 上的标记

ios - 调整 collectionView.scrollToItem 考虑 inset?

cocoa - 核心数据、托管对象上下文、NSArrayController..让我理顺一下

ios - 否定核心数据 NSPredicate 关系的麻烦

ios - RestKit:原始关系的映射

cocoa - 在早期开发过程中,当数据丢失是预期且可接受的时,可轻松进行核心数据迁移

core-data - 'NSInternalInconsistencyException',原因 : '+entityForName: could not locate an NSManagedObjectModel for entity name

ios - 推送基于 swift 的应用程序所需的 Xcode 版本

ios - 我的应用程序应该只使用一个托管对象上下文吗?