Основные данные: дополнительный объект, вставленный в контекст управляемого объекта после перезапуска приложения - PullRequest
1 голос
/ 01 января 2012

при загрузке Root View Controller управляемый объект с именем Target должен быть создан с использованием удобного метода:

- (void)viewDidLoad {
    [super viewDidLoad];

    if (context == nil) { 
       context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
    }

    if ([fetchedResultsController.fetchedObjects count] < 1) {
       Target *aTarget = (Target *)[NSEntityDescription insertNewObjectForEntityForName:@"Target" inManagedObjectContext:context]; 
    }

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) {
       // Update to handle the error appropriately.
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }

     if(![context save:&error]){  
       //Handle error.
     } ...

Если я запускаю приложение на своем iPhone из Xcode, все работает нормально. Тем не менее, если я остановлю тестовый запуск и перезапущу приложение на iPhone, будет создан новый управляемый объект, несмотря на условие

[fetchedResultsController.fetchedObjects count] < 1) 

, кажется, не удовлетворен (в конце концов, я просто не знаю почему). Как только приложение запускается на телефоне независимо от XCode, я могу закрыть и перезапустить его, не увеличивая количество созданных управляемых объектов. Только первый раз после отключения его от Xcode. Примечание. Отключение от XCode вызывает ошибку Segmentation: 11 , которая также появляется, когда я отключаю другое приложение Core Data от XCode. Так что я бы не приписывал эту ошибку моей проблеме. Есть идеи, как запретить приложению создавать этот дополнительный объект? Вам нужно больше кода, чтобы выяснить проблему? Большое спасибо.

Ответы [ 2 ]

1 голос
/ 07 января 2012

Thuggish Nuggets & adonoho, большое спасибо за вашу помощь. Вы направили меня в правильном направлении. Я переключил два оператора, как предложено, и добавил следующее условие при извлечении объекта из контекста управляемого объекта:

if ([fetchedResultsController.fetchedObjects count] > 0) {
  id currObj = [fetchedResultsController.fetchedObjects objectAtIndex:0];  
}

Без этого условия я получил ошибку NSRangeExeption ([__NSArrayI objectAtIndex:]: индекс 0 вне границ для пустого массива) при переключении двух операторов. Следуя вашим советам, при запуске приложения новый объект не создается. Спасибо большое!

1 голос
/ 01 января 2012

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

Попробуйте переключить 2-й и 3-й if операторы так, чтобы вы сначала выполняли выборку. Я бы дал вам код, но форматирование кода оказывается очень трудным для использования с моего iPad.

...