У меня есть странная ошибка. У меня есть связь между объектом вызова и статусом. имя отношения от объекта вызова - 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);
}
Я глупый вопрос: вы сохраняете контекст?. Лучше всего, вы можете посмотреть, сохраняется ли на диске. –
Привет, да, у меня есть контекст. Я обращаюсь к нему через aCall.statusForCall.statusID строк до этого, когда я получаю aCall.callID, и другие атрибуты вызова отлично работают. объект состояния должен быть неисправен, поскольку я обращаюсь к его свойствам не только к объекту. Данные явно сохраняются с помощью [context save & error]; –
, и это происходит только через некоторое время (выглядит как дни после загрузки приложения). и лучше всего то, что я не могу воспроизвести его в среде разработки! –