if (win) {
// Game was won, set completed in puzzle and time
// Calculate seconds taken
int timeTaken = (int)([NSDate timeIntervalSinceReferenceDate] - self.gameStartTime);
int bestTime = [[self.puzzle valueForKey:@"bestTime"] intValue];
if (timeTaken < bestTime && bestTime != 0) {
[self.puzzle setValue:[NSNumber numberWithInt:timeTaken] forKey:@"bestTime"];
NSLog(@"Best time for %@ is %@", [self.puzzle valueForKey:@"name"], [self.puzzle valueForKey:@"bestTime"]);
}
}
Это код из игры для iPad, которую я делаю, и я использую Core Data для хранения уровней. Когда уровень завершен и выигран, я хочу установить лучшее время для этого уровня. Затраченное время рассчитывается, и если оно лучше предыдущего лучшего времени, я хочу установить его как лучшее время для уровня.
Этот код не работает в строке int bestTime, когда он пытается получить лучшее время из self.puzzle, который является NSManagedObject из Core Data. Лучшее время хранится как целое число 32 в модели Core Data. Это не срабатывает с ошибкой SIGABRT.
'[<NSManagedObject 0x95334d0> valueForUndefinedKey:]: the entity Puzzle is not key value coding-compliant for the key "bestTime".'
Я искал в Интернете причины, почему это происходит и как это исправить, но, похоже, ничего не помогло. Есть и другие места, где я получаю доступ к целочисленным значениям из модели Core Data, и они отлично работают, хотя используются для фильтрации и сортировки запросов.
Я также не знаю, будет ли работать строка, в которой я установил значение.
Мы будем благодарны за любую помощь по этому поводу.
РЕДАКТИРОВАТЬ: это код, который извлекает массив головоломок, одна из которых принята за приведенную выше головоломку.
// Define our table/entity to use
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Puzzle" inManagedObjectContext:managedObjectContext];
// Setup the fetch request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
// Set the filter for just the difficulty we want
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"difficulty == %d", difficulty];
[request setPredicate:predicate];
// Define how we will sort the records
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sortid" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];
// Fetch the records and handle an error
NSError *error;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
Хорошо, во-первых, я хотел бы поблагодарить всех, кто предложил идеи. Возможно, они не помогли мне решить проблему, но Я узнал больше о Core Data, и всегда полезно выяснить, что я должен проверять, когда что-то не работает.
Я действительно не знаю, в чем была проблема. До сегодняшнего утра у меня был Xcode открыт около 5 дней, я думаю, и вчера я добавил атрибут bestTime в модель данных. Могу только предположить, что за 5 дней Xcode стал немного нестабильным и думал, что он был сохранен, хотя это не так. Я проверил, что у меня сохранил атрибуты модели, на самом деле я должен был проверить 3 или 4 раза, а также свою привычку нажимать Command + S после любого внесенного мной изменения.
В любом случае, сегодня я перезагрузил свою машину, и когда я запустил Xcode несколько раз несколько минут назад я понял, что «bestTime» нет в файле модели. Я добавил его, сбросил настройки в симуляторе iPad, и он сработал.
Еще раз спасибо всем за помощь, извините, решение было не более интересным и основанным на коде. Хотя мне легче оттого, что причиной не был мой код.
Я не думаю, что здесь достаточно информации, чтобы определить причину. Вы можете попробовать прочитать Руководство по устранению неполадок с основными данными ; одна из возможных причин может заключаться в том, что вы инициализировали этот конкретный экземпляр Puzzle, используя простой init, а не initWithEntity.
Если вы добавили атрибут bestTime в модель позднее, вы могли забыть поместить объявление и реализацию для них в подключенный класс управляемых объектов.
Попробуйте воспользоваться удобными действиями в разделе Design -> Data Model -> Copy Objective-C ... декларации/реализации методов в буфер обмена (при редактировании файла модели).
У этого управляемого объекта нет атрибут с именем « bestTime
». Согласно сообщению об исключении, это определенно головоломка, поэтому вы не объявили атрибут с именем bestTime
в своей модели (или вы написали его с ошибкой или написали с заглавной буквы по-другому).