Какие изменения в Core Data после сохранения? - PullRequest
0 голосов
/ 18 марта 2010

У меня есть 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 в сообщении консоли? У объектов обычно есть этот дополнительный ', или это откуда-то? Если оно пришло откуда-то и вызывает запрос на выборку, у кого-нибудь есть какие-нибудь яркие идеи, откуда это могло бы быть, или как я могу отследить его источник?

1 Ответ

1 голос
/ 18 марта 2010

Звучит так, будто вы устанавливаете что-то в ноль и заставляете вас вернуть ноль. Я хотел бы пройтись по вашему коду сохранения и получить в отладчике и искать объекты, для которых установлено значение nil, когда вы этого не ожидаете.

обновление

Есть ли у вас код где-нибудь , который может манипулировать отношениями? Возможно, что-то в -awakeFromFetch:, что приводит к повреждению отношений?

Если они правильно сохраняются в первый раз, а затем терпят неудачу, то действительно указывает на что-то в вашем коде, разрушающее эти отношения. Вы подклассы NSManagedObject для этих объектов? Если да, то можете ли вы переопределить метод -init...?

обновление

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...