核心数据崩溃:[__NSArrayM insertObject:atIndex:]:object不能为nil [英] Core Data Crash: [__NSArrayM insertObject:atIndex:]: object cannot be nil

查看:592
本文介绍了核心数据崩溃:[__NSArrayM insertObject:atIndex:]:object不能为nil的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



这里是我的实现:



AppDelegate.h

  #import< UIKit / UIKit.h> 
#importFavoritosViewController.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



<$ c $ p> - (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]){
/ *
用代码来正确处理错误。

abort()导致应用程序生成崩溃日志并终止。您不应在运送应用程序中使用此功能,但在开发过程中可能很有用。如果无法从错误中恢复,请显示一个警报面板,指示用户通过按主页按钮退出应用程序。
* /
NSLog(@未解析的错误%@,%@,错误,[错误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;
}


/ **
返回应用程序的管理对象模型。
如果模型不存在,则通过合并应用程序包中找到的所有模型来创建该模型。
* /
- (NSManagedObjectModel *)managedObjectModel {

if(managedObjectModel!= nil){
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}


/ **
返回应用程序的持久存储协调器。
如果协调器不存在,则会创建它并将应用程序的存储添加到其中。
* /
- (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]){
/ *
使用代码来替换此实现以适当地处理错误。

abort()导致应用程序生成崩溃日志并终止。您不应在运送应用程序中使用此功能,但在开发过程中可能很有用。如果无法从错误中恢复,请显示一个警报面板,指示用户通过按主页按钮退出应用程序。

此处的错误的典型原因包括:
*持久存储不可访问
*持久存储的模式与当前管理对象模型不兼容
检查错误消息来确定实际问题是什么。
* /
NSLog(@未解析的错误%@,%@,错误,[错误userInfo]);
abort();
}

return persistentStoreCoordinator;
}




- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];
}



我还有一个xcdatamodeld与Event实体及其属性, .h,Event.m from it。



在FavoritosViewController中,我也有所有的方法,但问题出现在所有之前。



它来自

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

应用程式崩溃,显示如下:



- [__ NSArrayM
insertObject:atIndex:]:object不能为nil'


任何想法?谢谢!!!

解决方案

当我的代码运行[NSManagedObjectModel mergedModelFromBundles:nil]时,我有一个类似的问题。这发生在xCode意外崩溃后。即使当我回到我的代码的已知好的版本,我仍然有同样的错误,是由于某种腐败。



经过多次实验,我能够通过退出Xcode和iPhone模拟器解决问题,然后从以下目录中删除所有文件:

  $ cd / Users / john / Library / Developer / Xcode / DerivedData 

$ rm -R -f ./(folder对应于我的项目名称)

$ cd / Users / john / Library / Application Support / iPhone Simulator / 5.0 / Applications

$ rm -R *

这样可以清除模拟器损坏的临时文件和状态,错误消失。


I am trying to implement CoreData in my application to store a small database.

Here my implementation:

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];
}

I have also a xcdatamodeld with "Event" entity with theirs attributes, and Event.h, Event.m from it.

In FavoritosViewController I have also all the methods, but the problem comes before all that.

It comes at

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

The app crash and it appears the following:

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

Any ideas??? Thanks!!!

解决方案

I had a similar problem with the same error message when my code ran [NSManagedObjectModel mergedModelFromBundles:nil]. This happened after xCode crashed on me unexpectedly. Even when I reverted back to a known good version of my code, I still had the same error that was due to some sort of corruption.

After much experimenting, I was able to solve the problem by exiting Xcode and the iPhone simulator, and then deleting all files from the following directories:

$ 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 *

This was able to clear the corrupted temporary files and state for the simulator, and the error disappeared.

这篇关于核心数据崩溃:[__NSArrayM insertObject:atIndex:]:object不能为nil的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆