2011-09-25 3 views
0

Я намерен сделать простую функцию в AppDelegate для хранения некоторых данных в базе данных (CoreData), которые будут вызываться из разных классов ViewController, подключенных до AppDelegate. Это тело этой функции:CoreData (сохранение нового объекта) в AppDelegate = SIGABRT

- (void) setSetting:(NSString *)setting :(NSString *)value {  
    NSManagedObject* newSetting = [NSEntityDescription insertNewObjectForEntityForName:@"EntityName" inManagedObjectContext:self.managedObjectContext]; 
    [newSetting setValue:value forKey:setting]; 
    NSError* error; 
    [self.managedObjectContext save:&error]; 
} 

Но вызов этой функции (даже из самого AppDelegate) возвращает SIGABRT на линии с setValue

Но когда я реализовать функцию в ViewController классе (замене self. с правильным подключением до AppDelegate, конечно) - это работает штраф.

Я не понимаю, и я очень благодарен за помощь в создании гибкой функции в AppDelegate для сохранения данных в базе данных.

+0

Ваша сущность действительно называется «EntityName»? – Rog

+0

У вас есть свойство 'setting' в делегате приложения? – TechZen

+0

@Rog: Это просто пример. – Heps

ответ

1

Это немного похоже на то, что часть key не является номером NSString или не соответствует нулевому типу value. Пожалуйста, проверьте и, возможно, сделайте порядок аргументов в своей функции таким же, как в методе setValue:forKey, чтобы избежать путаницы.

Кроме того, согласно documentation, исключение будет поднято, если в модели не определено key - так что дважды проверьте свои ключевые строки.

BTW, если это ваша ошибка, рекомендуется отойти от KVC и создать свои собственные подклассы NSManagedObject вместо этого, как привычку - сделать жизнь намного проще.

+0

Благодарим за ответ, но это не решило проблему. ключ и значение - это свойства NSString, а также свойства объекта. И нет видимого исключения (или я не знаю, как их просматривать). В консоли есть только SIGABRT без смелых комментариев:/ – Heps

+0

Логика диктует, что что-то должно отличаться в функции от того, когда вы вызываете ее с другого контроллера. Возможно, ваша управляемая объектная модель не была правильно инициализирована; что ваш 'managedObjectContext' равен нулю; и такие вещи. 'NSLog' все переменные, о которых идет речь, и вы должны найти проблему. – Mundi

0

Наиболее вероятным объяснением является то, что эта линия:

NSManagedObject* newSetting = [NSEntityDescription insertNewObjectForEntityForName:@"EntityName" inManagedObjectContext:self.managedObjectContext]; 

... возвращает ноль объект либо потому, что имя сущности является неправильным или потому, что managedObjectContext сама ноль или иным образом недействительны.

Поскольку проблема возникает только в делегате приложения, я бы сначала подозревал, что проблема связана с self.managedObjectContext.

Смежные вопросы