Ошибка Core Data: [__NSArrayM insertObject: atIndex:]: объект не может быть nil

Я пытаюсь реализовать 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 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];
}

У меня также есть xcdatamodeld с сущностью "Event" с их атрибутами и Event.h, Event.m от него.

В FavoritosViewController у меня также есть все методы, но проблема возникает перед этим.

Он приходит в

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

Ошибка приложения и появляется следующее:

* Завершение приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: '* - [__ NSArrayM insertObject: atIndex:]: объект не может быть nil '

Любые идеи??? Спасибо!!!

Ответ 1

У меня была аналогичная проблема с тем же сообщением об ошибке, когда мой код работал [NSManagedObjectModel mergedModelFromBundles: nil]. Это произошло после того, как xCode неожиданно упал на меня. Даже когда я вернулся к известной хорошей версии моего кода, у меня все еще была та же ошибка, которая была вызвана каким-то коррупционным эффектом.

После долгих экспериментов я смог решить проблему, выйдя из 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 *

Это позволило очистить поврежденные временные файлы и состояние для симулятора, и ошибка исчезла.

Ответ 2

Я переместил файл Model.xcdatamodeld в другую папку и получил эту ошибку. Начиная с чистого эмулятора не помогло. Видимо, Xcode где-то ссылается на этот файл.

Мое решение состояло в том, чтобы сделать резервную копию моего старого файла Model.xcdatamodeld, удалить его из проекта, создать новый файл модели в той же папке и затем заменить этот файл резервной копией.

Ответ 3

Была аналогичная ошибка. Когда вы сначала создаете модель в Xcode, , похоже, она сохраняет внутреннее имя.

Я переименовал файл модели - это вызвало проблему, упомянутую OP.

Возвращение имени модели назад (и создание чистой сборки + удаление формы приложения из устройства) исправило проблему для меня.

Ответ 4

У меня была точно такая же ошибка после того, как я переименовал файл модели основных данных. Удаление каталога Xcode/DerivedData, очистка проекта, удаление приложения из симулятора, перезапуск Xcode, обновление Xcode и т.д. Не сработало.

Чтобы заставить его работать снова, я выбрал "iOS Simulator" → "Reset Содержание и настройки..." в верхнем меню.

Ответ 5

Здесь много ответов, но я не уверен, что кто-то из них точно сформулирует, что именно не так.

Я понимаю, что основной причиной этого сбоя является то, что ваше приложение, установленное на устройстве, имеет пустую модель. например. если вы посмотрите на устройство с помощью iFunBox/iExplore, вы увидите MyApp.app/MyModel.momd, у которого есть VersionInfo.plist, где словарь NSManagedObjectModel_VersionHash пуст, или NSManagedObjectModel_CurrentVersionName указывает на модель, которая не существует.

Причины этого могут различаться, но в основном все связаны с тем, что ваша модель не правильно настроена в xcode. В нашем случае файл проекта не синхронизировался с файловой системой, и модель находилась в другом месте, где был xcode, хотя это было, но наличие пустой последней версии также могло вызвать ее. Большинство из них можно устранить, удалив проект из xcode и добавив его снова, а затем установите правильную установку последней версии.

С проблемами такого рода, это также очень важно проверить из чистого состояния - то есть. очистка папки сборки в xcode (cmd-shift-option k) и удаление приложения с устройства/симулятора (так как иначе xcode может оставлять файлы, лежащие вокруг, что делает его похожим на работу).

Кажется, что ошибка в xcode (по крайней мере, в xcode 4.6 и 5.0.1) означает, что в некоторых из этих случаев, когда она должна быть в состоянии, она не выдаёт предупреждение о сборке. Я поднял это в Apple bugreporter как 15186008.

Ответ 6

У меня была такая проблема, как сейчас. Проблема была в файле модели, у меня был файл с версией модели, и как-то не было файла внутри текущей версии модели (вероятно, ошибка svn commit). Поэтому я добавил этот недостающий файл, выбрал его как текущую модель, и все было хорошо.


Обратите внимание, что замена файла модели нарушает совместимость с существующими хранилищами на устройствах/симуляторах, даже если это то же самое (исправьте меня, если я ошибаюсь, но это было так для меня). Таким образом, легкая миграция не будет работать, если вы:

  • имеют модель с версиями 1 и 2
  • запустить приложение и использовать модель 2
  • заменить файл модели для версии 2 на 2 '(даже с теми же полями/типами)

существующее хранилище устройств/симуляторов не будет работать с 2 ', вы получите 2 или имеете легкую миграцию для этих хранилищ устройств/симуляторов

Ответ 7

Проблемы такого рода могут быть решены с помощью:

  • Удалить приложение в симуляторе
  • Сделайте глубокую очистку, используя cmd + alt + shift + k

Затем перестройте и запустите приложение.

Помог мне всегда много в dev-фазе с CoreData!

Ответ 8

Удалось решить эту ошибку, просто удалив ссылку *.xcdatamodeld из проекта и добавив ее обратно.

Ответ 9

Сбой происходит из-за того, что написанный вами код пытается вставить нуль в MutableArray. Отлаживайте приложение, в которое вы вставляете объекты, и проверяйте, есть ли объект!= Nil, затем вставляйте в массив, иначе NSLog (@ "Object is no" );

Ответ 10

"У меня такая же ошибка. Но не для Core Data.. У меня ошибка для Array.. Так что я сделал, просто проверяю объект перед вставкой и добавлением..."

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