核心数据崩溃::对象不能为零

我想在我的应用程序中实现CoreData来存储一个小型数据库。

在这里我的实现:

AppDelegate.h

#import <UIKit/UIKit.h> #import "FavoritosViewController.h" #import <CoreData/CoreData.h> @interface XXX : NSObject <UIApplicationDelegate>{ NSManagedObjectModel *managedObjectModel; NSManagedObjectContext *managedObjectContext; NSPersistentStoreCoordinator *persistentStoreCoordinator; } - (NSString *)applicationDocumentsDirectory; @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; @end 

AppDelegate.m

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ FavoritosViewController *global=[[FavoritosViewController alloc]init]; global.managedObjectContext=[self managedObjectContext]; . . . } - (void)applicationWillTerminate:(UIApplication *)application { NSError *error = nil; if (managedObjectContext != nil) { if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { /* Replace this implementation with code to handle the error appropriately. abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. */ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } } - (NSManagedObjectContext *) managedObjectContext { if (managedObjectContext != nil) { return managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { managedObjectContext = [[NSManagedObjectContext alloc] init]; [managedObjectContext setPersistentStoreCoordinator: coordinator]; } return managedObjectContext; } /** Returns the managed object model for the application. If the model doesn't already exist, it is created by merging all of the models found in the application bundle. */ - (NSManagedObjectModel *)managedObjectModel { if (managedObjectModel != nil) { return managedObjectModel; } managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; return managedObjectModel; } /** Returns the persistent store coordinator for the application. If the coordinator doesn't already exist, it is created and the application's store added to it. */ - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (persistentStoreCoordinator != nil) { return persistentStoreCoordinator; } NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"FavoritosDatabase.sqlite"]]; NSError *error = nil; persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { /* Replace this implementation with code to handle the error appropriately. abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. Typical reasons for an error here include: * The persistent store is not accessible * The schema for the persistent store is incompatible with current managed object model Check the error message to determine what the actual problem was. */ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return persistentStoreCoordinator; } - (NSString *)applicationDocumentsDirectory { return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; } 

我也有一个带有“Event”实体的xcdatamodeld,它们的属性是Event.h,Event.m。

在FavoritosViewController我也有所有的方法,但问题出现在所有这一切。

它来了

 managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

应用程序崩溃,并出现以下内容:

*由于未捕获的exception“NSInvalidArgumentException”而终止应用程序,原因:'* – [__ NSArrayM insertObject:atIndex:]:object can not be nil'

有任何想法吗??? 谢谢!!!

当我的代码运行[NSManagedObjectModel mergedModelFromBundles:nil]时,我有类似的问题与相同的错误消息。 这是在xCode意外地撞上我之后发生的。 即使当我恢复到我的代码已知的好版本,我仍然有同样的错误是由于某种forms的腐败。

经过大量的实验,我可以通过退出Xcode和iPhone模拟器来解决问题,然后删除以下目录中的所有文件:

 $ cd /Users/john/Library/Developer/Xcode/DerivedData $ rm -R -f ./(folder corresponding to my project name) $ cd /Users/john/Library/Application Support/iPhone Simulator/5.0/Applications $ rm -R * 

这是能够清除损坏的临时文件和模拟器的状态,并且错误消失。

我把我的Model.xcdatamodeld文件移动到另一个文件夹,并得到这个错误。 从一个干净的模拟器开始没有帮助。 显然,Xcode保持对这个文件的引用。

我的修复是备份我旧的Model.xcdatamodeld文件,从项目中删除它,在同一个文件夹中创build一个新的模型文件,然后用备份replace这个文件。

有一个类似的错误。 当你第一次在Xcode中创build模型时, 它似乎在内部存储模型的名称

我重命名了模型文件 – 这导致了OP提到的问题。

恢复模型名称(并进行构build清理+从设备删除应用程序)解决了这个问题。

核心数据模型文件重命名后,我有完全相同的错误。 删除Xcode / DerivedData目录,清理项目,从模拟器中卸载应用程序,重新启动Xcode,升级Xcode等都不起作用。

为了重新开始工作,我从顶部菜单中select了“iOS模拟器” – >“重置内容和设置…”。

这里有很多答案,但是我不确定他们中的任何一个都能够清楚地说出错在哪里。

我的理解是,这个崩溃的根本原因是你的应用程序安装在设备上时,有一个空的模型。 例如。 如果使用iFunBox / iExplore查看设备,则会看到一个MyApp.app/MyModel.momd,其中有一个VersionInfo.plist,其中NSManagedObjectModel_VersionHashes字典为空,或者NSManagedObjectModel_CurrentVersionName指向不存在的模型。

原因可能会有所不同,但基本上都与您的模型没有在xcode中正确设置有关。 在我们的例子中,项目文件与文件系统不同步,模型位于xcode的不同位置,但是最新的版本也可能导致它。 其中大部分可以通过从Xcode中删除项目并再次添加,然后检查最新版本是否正确设置来解决。

有了这种性质的问题,从一个干净的状态进行testing也是非常重要的, 清理xcode中的build文件夹(cmd-shift-option k), 从设备/模拟器中删除应用程序(否则xcode可能会使文件处于这种状态,使其看起来像事情正在工作)。

在xcode中似乎存在一个错误(至less在xcode 4.6和5.0.1中),这意味着它在某些情况下不会发出构build警告。 我已经在苹果的bugreporter提出这个15186008。

我刚才有这样的问题。 问题出在模型文件中,我有一个版本化的模型文件,不知何故目前的模型版本里面没有文件(可能是一些svn提交错误)。 所以我已经添加了缺less的文件,select它作为当前模型,一切工作正常。


请注意,replace模型文件会破坏设备/模拟器上现有存储的兼容性,即使它是相同的(纠正我,如果我错了,但是这对我来说就是这样)。 所以轻量级迁移不会工作,如果你:

  1. 有版本1和2的模型
  2. 运行应用程序并使用模型2
  3. 用2'replace版本2的模型文件(即使具有相同的字段/types)

现有的设备/模拟器存储将无法使用2',您将获得2或轻微的迁移破坏这些设备/模拟器存储

这种问题可以通过以下方式解决:

  • 删除模拟器中的应用程序
  • 使用cmd + alt + shift + k进行深度清理

然后重build并运行您的应用程序。

帮助我始终在CoreData的开发阶段!

通过从项目中删除* .xcdatamodeld引用并重新添加它来解决这个错误。

发生崩溃是因为你写的代码试图在MutableArray中插入一个零。 debugging你的应用程序插入对象的位置,并检查对象!= nil,然后插入数组,否则NSLog(@“Object is nil”);

“我得到了类似的错误..但不是核心数据..我得到了数组错误..所以我所做的只是检查对象之前插入和添加..”

 NSMutableArray *tmpArr = [[NSMutableArray alloc] init]; NSString *name; name = @"sample"; if(name) [tmpArr addObject:name];