Если у вас не было сбоев crush (и не только в этом случае), сначала я бы заменил строку:
[managedObjectContext save: &error];
с чем-то вроде:
// Save the managed object context.
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
NSLog(@"Failed to save object to managed object context: %@, %@", error, [error userInfo]);
}
Возможно (и я думаю, что наиболее вероятно), NSlog в этом случае даст вам некоторую информацию.
В любом случае, спасение человека - довольно опасная операция, и вы не должны оставлять ее без дополнительной, хотя бы небольшой, проверки.
Удачи!
EDIT:
Не могли бы вы опубликовать, как на самом деле вы делаете выборку объектов из базы данных. Насколько я понимаю, вы выполняете это здесь:
tracks = [self fetchTracks];
а что там?
Кроме того, я нахожу немного запутанным фраза:
Я использую NSFetchRequest, а не контроллер fetchedResults.
Вы создаете объект NSFetchRequest для того, чтобы описать , что вы хотите получить (извлечь) из базы данных. Вы делаете это правильно, но я не вижу в коде, где вы на самом деле используете этот запрос тогда ...
Для извлечения используется NSFetchedResultsController .
Вы настраиваете что-л. как:
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
А затем, чтобы выполнить фактическую выборку, вы делаете что-то. как:
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
(после этого вы можете получить все объекты из fetchedResultsController)
ИЛИ , если вы не хотите использовать контроллер, напрямую выберите массив:
NSError *error = nil;
NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];
if (array == nil)
{
// Deal with error...
}