NSManagedObject Failed - PullRequest
       36

NSManagedObject Failed

4 голосов
/ 26 сентября 2011

У меня есть NSManagedObject, некоторые свойства которого инициализируются в начале программы.Когда я ссылаюсь на этот объект позже, он кажется неисправным, а свойства недоступны.Я не уверен, что мне нужно делать.

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

Вотфрагмент кода, где он инициализируется как значение свойства синглтона.(Этот синглтон доступен для многих частей моего кода):

    favoritesCollection = [[SearchTerms alloc] initWithEntity:[NSEntityDescription entityForName:@"SearchTerms" inManagedObjectContext:moc] insertIntoManagedObjectContext:moc];

    favoritesCollection.keywords = @"Favorites List";
    favoritesCollection.isFavoritesCollection = [NSNumber numberWithBool:YES];
    favoritesCollection.dateOfSearch = [NSDate NSCExtendedDateWithNaturalLanguageString:@"4000"];
    favoritesCollection.pinColorIndex = 0;  

    [moc save:&error];

    NSLog(@"(favoritesCollection) = %@", favoritesCollection);
}

return favoritesCollection;

Когда я смотрю на FavoritesCollection с NSLog, я вижу это (я добавил несколько строк, чтобы было легче читать):

(favoritesCollection) = 
<SearchTerms: 0x5c28820> 
(entity: SearchTerms; id: 0x5a6df90 
<x-coredata://3936E19F-C0D0-4587-95B6-AA420F75BF78/SearchTerms/p33> ; 
data: {
    dateOfSearch = "4000-09-25 12:00:00 -0800";...*more things after this*

После возврата другой NSLog показывает, что содержимое не повреждено.

Когда я обращаюсь к этому экземпляру позже, я вижу это в отладчике:

<SearchTerms: 0x5c28820> 
(entity: SearchTerms; id: 0x5a6df90 
<x-coredata://3936E19F-C0D0-4587-95B6-AA420F75BF78/SearchTerms/p33> ; 
data: <fault>)

иэто все.

Поэтому я считаю, что объект сохраняется (я явно сохраняю его там, где он возвращается).У меня есть зомби, и это не похоже на зомби.

У меня есть только один managedObjectContext в программе, поддерживаемый в синглтоне.

Итак, что происходит, и как мне получитьк свойствам, которые были сохранены?

Ответы [ 3 ]

1 голос
/ 26 сентября 2011

В вашем объекте нет ничего плохого, и я думаю, что вы, возможно, неправильно истолковываете здесь значение "вина".

Из документации Apple:

"Ошибка - это механизм, который Core Data использует для сокращения использования памяти вашим приложением ..."

После того, как вы попытаетесьполучить доступ к любому из свойств объекта, он попадет в базу данных для всех свойств объекта.

Подробнее здесь http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.html

0 голосов
/ 08 октября 2011

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

Указатель наСущность FavoritesCollection хранится на протяжении всей жизни программы, поэтому я ожидал, что она сможет увидеть ее содержимое в любое время после ее создания.

Из Руководства по программированию основных данных

Обработка ошибок прозрачна - вам не нужно выполнять выборку для реализации ошибки.Если на каком-то этапе осуществляется доступ к постоянному свойству объекта ошибки, то Core Data автоматически извлекает данные для объекта и инициализирует объект (см. Ссылку класса NSManagedObject для списка методов, которые не вызывают сбои ошибок).Этот процесс обычно называют активацией ошибки.

Базовые данные автоматически запускают ошибки при необходимости (при обращении к постоянному свойству ошибки).

Из того, что я могу сказатьчитая руководство по программированию, можно увидеть ошибки в отношениях (ссылки на другие объекты), когда вы смотрите на какую-либо конкретную сущность.Но замечание ошибок постоянных значений свойств не упоминается.Я считаю, что, в общем, если объект находится в памяти, то его свойства не должны быть нарушены, но его отношения могут быть нарушены.

Тот факт, что объект FavoritesCollection был полностью неисправен (свойства и отношения), и неисправность не была устранена, выявила проблему.В этом случае это соответствует сущности, которой больше нет в базе данных.

0 голосов
/ 26 сентября 2011

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

...