在我的应用程序中,我能够清除数据库中的所有数据。完成此操作后,将解析捆绑的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];
奇怪的是,这个相同的代码在其他项目中运行良好,除了数据内容之外没有其他区别。非常感谢任何帮助!
答案 0 :(得分:13)
无法从此NSManagedObjectContext的协调器 >获取“对象的持久存储”
此消息表示您尝试使用从刚删除的数据存储中加载的托管对象。您从协调器中删除了持久性存储并删除了存储文件,但您仍然至少有一个NSManagedObject
从该存储中加载。您不能再使用这些对象,因为如果这样做,您将获得此特定异常。确保在第二个代码段中的核心数据堆栈核心之前删除任何现有的托管对象。
至于为什么这个应用程序在另一个应用程序中运行,很可能该应用程序没有保留过时的托管对象。