2014-12-02 6 views
0

У меня есть странная ошибка. У меня есть связь между объектом вызова и статусом. имя отношения от объекта вызова - statusForCall.Core Data возвращает nil для связи с действительным объектом

данные импортируются в основные данные программно из JSON. он не будет создавать вызов без статуса. пользователь не имеет никакого способа изменить statusForCall на nil.

однако после периода времени (кажется, дней) при доступе к вызовам через запрос выборки в массив, когда я обращаюсь к aCall.StatusForcall.statusID, он начинает возвращать нуль. Кодекс не может обновить statusForCall до нуля.

Любые идеи, что может быть причиной этого и с чего начать искать?

cachename nil во всем приложении.

интересно, если пользователь повторно загружает приложение, проблема решена. Код не изменяется, и данные не изменяются (нет миграции - это одна и та же версия), но по какой-то причине это ВСЕГДА исправляет проблему.

Я действительно пытаюсь понять, что посмотреть, чтобы добраться до сути.

код для установки статуса ниже (отредактирован для краткости). Как я сказать, что работа изначально имеет статус, но, кажется, теряет связь после периода ода времени (я не могу сказать, как долго это, как пользователь ненадежно на этом)

Call *theCall; 

     //see if we have the call on the device - if not create a new one, if we do update that one 
     BOOL contentIsInCoreData = NO; 
     for (Call *thisCall in existingCalls) 
     { 
      if ([thisCall.callID isEqualToNumber:[checkDic objectForKey:@"callID"]]) 
      { 
       theCall=thisCall; 
       contentIsInCoreData = YES; 
      } 

     } 



     NSError * error = nil; 


     NSDateFormatter *dateFormat =[[NSDateFormatter alloc] init]; 
     [dateFormat setDateFormat:@"dd-MMM-yyyy"]; 

     if (contentIsInCoreData==NO) 
     { 
      [self.postDelegate updateGetJobsAndTimesProgress:[NSString stringWithFormat:@"Adding new job: %@",[checkDic objectForKey:@"woRef"]]]; 

      //new call add bits that will not change 
      theCall = (Call*)[NSEntityDescription insertNewObjectForEntityForName:@"Call" inManagedObjectContext:self.managedObjectContext]; 

}

  //set various properties from the JSON dictrionary – these have been cut down for the example code 
      theCall.woRef=[checkDic objectForKey:@"woRef"]; 
      theCall.shortAddress=[checkDic objectForKey:@"shortAddress"]; 
      theCall.address=[[checkDic objectForKey:@"address"] stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"]; 
      theCall.postCode=[checkDic objectForKey:@"postCode"]; 
      theCall.callID=[checkDic objectForKey:@"callID"]; 



    //****THIS IS WHERE THE STATUS IS SET – PLEASE NOTE THE STATUS WILL EXIST IN CD ALREADY and the JSON WILL have a valid statusID 
      NSFetchRequest *request2=[NSFetchRequest fetchRequestWithEntityName:@"CallStatus"]; 
      request2.predicate=[NSPredicate predicateWithFormat:@"callStatusID ==%@",[checkDic objectForKey:@"callStatusID"]]; 
      error = nil; 
      NSArray * existingStatus = [self.managedObjectContext executeFetchRequest:request2 error:&error]; 

      CallStatus *selectedStatus; 
      selectedStatus=[existingStatus firstObject]; 


       theCall.statusForCall = selectedStatus; 

     error = nil; 
     if ([self.managedObjectContext save:&error]) 
     { 
      //NSLog(@"saved job"); 
     } 
     else 
     { 
      NSLog (@"***BROKEN GET JSON!!!\r\r%@",error); 
     } 
+0

Я глупый вопрос: вы сохраняете контекст?. Лучше всего, вы можете посмотреть, сохраняется ли на диске. –

+0

Привет, да, у меня есть контекст. Я обращаюсь к нему через aCall.statusForCall.statusID строк до этого, когда я получаю aCall.callID, и другие атрибуты вызова отлично работают. объект состояния должен быть неисправен, поскольку я обращаюсь к его свойствам не только к объекту. Данные явно сохраняются с помощью [context save & error]; –

+0

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

ответ

0

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

Смежные вопросы