ios – 重新创建Persistant Store后的核心数据错误

前端之家收集整理的这篇文章主要介绍了ios – 重新创建Persistant Store后的核心数据错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的应用程序中,我能够清除数据库中的所有数据.完成此操作后,将解析捆绑的 JSON,然后将其保存到数据库(以便将数据库返回到默认状态).解析和保存此JSON的操作在任何情况下都可正常工作,除非在清除并重新创建持久性存储之后,在这种情况下我得到’NSInvalidArgumentException’,原因:’无法从此NSManagedObjectContext的协调器访问对象的持久存储’.在保存在后台上下文中后尝试在我的主线程上下文中调用mergeChangesFromContextDidSaveNotification时抛出此异常.

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

  1. - (NSManagedObjectContext *)managedObjectContext {
  2.  
  3. NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary];
  4. NSManagedObjectContext *threadContext = threadDictionary[ckCoreDataThreadKey];
  5.  
  6. if (!threadContext) {
  7. threadContext = [self newManagedObjectContext];
  8. threadDictionary[ckCoreDataThreadKey] = threadContext;
  9. }
  10.  
  11. return threadContext;
  12. }

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

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

  1. [self.managedObjectContext lock];
  2. [self.managedObjectContext reset]; //to drop pending changes
  3. //delete the store from the current managedObjectContext
  4. if ([[self.managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[self.managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:error]) {
  5. [[NSFileManager defaultManager] removeItemAtURL:storeURL error:error];
  6.  
  7. [[self.managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSsqliteStoreType configuration:nil URL:storeURL options:nil error:error]; //recreates the persistent store
  8.  
  9. [self addSkipBackupAttributeToItemAtURL:storeURL];
  10. }
  11.  
  12. [self.managedObjectContext unlock];

奇怪的是,这个相同的代码在其他项目中运行良好,除了数据内容之外没有其他区别.任何帮助是极大的赞赏!

解决方法

The “Object’s persistent store is not reachable from this NSManagedObjectContext’s coordinator

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

至于为什么它在不同的应用程序中工作,很可能该应用程序不会持有陈旧的托管对象.

猜你在找的iOS相关文章