У меня есть Mac-приложение на основе Core Data, которое работает отлично, пока я не сохраню файл. Когда я сохраняю файл, кажется, что что-то меняется в основных данных, потому что мой исходный запрос на выборку больше ничего не выбирает. Это запрос на выборку, который работает до сохранения, но возвращает пустой массив после сохранения.
NSEntityDescription *outputCellEntityDescription = [NSEntityDescription entityForName:@"OutputCell"
inManagedObjectContext:[[self document] managedObjectContext]];
NSFetchRequest *outputCellRequest = [[[NSFetchRequest alloc] init] autorelease];
[outputCellRequest setEntity:outputCellEntityDescription];
NSPredicate *outputCellPredicate = [NSPredicate predicateWithFormat:@"(cellTitle = %@)", outputCellTitle];
[outputCellRequest setPredicate:outputCellPredicate];
NSError *outputCellError = nil;
NSArray *outputCellArray = [[[self document] managedObjectContext] executeFetchRequest:outputCellRequest
error:&outputCellError];
Я проверил с помощью [[[self document] managedObjectContext] registerObjects], чтобы убедиться, что объект все еще существует после сохранения, и кажется, что ничего не изменилось и объект все еще существует. Возможно, это что-то довольно простое, но кто-нибудь знает, что я могу делать неправильно? Если нет, то кто-нибудь может дать мне какие-либо указания на то, что может отличаться в модели Core Data после сохранения, поэтому у меня могут быть некоторые подсказки, почему запрос на выборку перестает работать после сохранения?
Редактировать
Я дошел до того, что понял, что именно отношения, похоже, разрываются после сохранения. Если я опускаю строки, устанавливающие предикат для запроса, запрос возвращает объекты в массиве. Я проверил регистрационные объекты, и оказалось, что отношения не повреждены, но если я сделаю что-то вроде сохранения файла, заново откройте его, а затем проверьте, что зарегистрированному объекту отношения установлены на ноль. Я открыл файл сохранения в виде XML-файла, и отношения кажутся неповрежденными при первом сохранении файла.
Я добавил скриншот части базовой модели данных, в которой нарушены отношения. У кого-нибудь есть идеи, почему сохранение файла в основных данных может нарушить отношения? Для справки я использую стандартную реализацию сохранения, встроенную в основные данные, поэтому пользовательский код сохранения отсутствует.
http://emberapp.com/splash6/images/littlesnapper/sizes/m.png
Редактировать
У меня нет -awakeFromFetch:
методов, которые запускаются при возникновении этой проблемы.
Для некоторых проблемных объектов я подклассифицировал NSManagedObject
, используя модель Core Recipes для KVO:
+(void)initialize
{
if (self == [OutputCell class])
{
NSArray *nameKeys = [NSArray arrayWithObjects:@"cell", @"sheet", @"table", nil];
[self setKeys:nameKeys
triggerChangeNotificationsForDependentKey:@"cellTitle"];
NSArray *measuresKeys = [NSArray arrayWithObjects:@"fivePercentile", @"maximum", @"mean", @"median",@"minimum",@"ninetyFivePercentile",@"standardDeviation",nil];
[self setKeys:measuresKeys
triggerChangeNotificationsForDependentKey:@"analysisResults"];
}
}
Похоже, что этот метод не срабатывает во время или после сохранения, поэтому проблема не в этом. В настоящее время я перебираю все остальные методы в коде, чтобы выяснить, вызывается ли какой-либо из них во время или после сохранения.
Редактировать
Следуя предложению Маркуса, приведенному ниже, мне удалось сделать запрос на выборку неудачным, прежде чем модель будет сохранена. Моя проблема сейчас заключается в том, что сообщение об этом возвращается в консоли при сбое:
HIToolbox: ignoring exception '+entityForName: could not locate an NSManagedObjectModel for entity name 'OutputCell'' that raised inside Carbon event dispatch
Сообщение консоли регистрируется после этого вызова:
NSEntityDescription *outputCellEntityDescription = [NSEntityDescription entityForName:@"OutputCell"
inManagedObjectContext:[[self document] managedObjectContext]];
Должно ли присутствовать дополнительное 'после OutputCell в сообщении консоли? У объектов обычно есть этот дополнительный ', или это откуда-то? Если оно пришло откуда-то и вызывает запрос на выборку, у кого-нибудь есть какие-нибудь яркие идеи, откуда это могло бы быть, или как я могу отследить его источник?