Сущность не соответствует кодированию значения ключа для ключа

    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];
7
задан Peter Hosey 13 June 2013 в 04:56
поделиться

4 ответа

Хорошо, во-первых, я хотел бы поблагодарить всех, кто предложил идеи. Возможно, они не помогли мне решить проблему, но Я узнал больше о Core Data, и всегда полезно выяснить, что я должен проверять, когда что-то не работает.

Я действительно не знаю, в чем была проблема. До сегодняшнего утра у меня был Xcode открыт около 5 дней, я думаю, и вчера я добавил атрибут bestTime в модель данных. Могу только предположить, что за 5 дней Xcode стал немного нестабильным и думал, что он был сохранен, хотя это не так. Я проверил, что у меня сохранил атрибуты модели, на самом деле я должен был проверить 3 или 4 раза, а также свою привычку нажимать Command + S после любого внесенного мной изменения.

В любом случае, сегодня я перезагрузил свою машину, и когда я запустил Xcode несколько раз несколько минут назад я понял, что «bestTime» нет в файле модели. Я добавил его, сбросил настройки в симуляторе iPad, и он сработал.

Еще раз спасибо всем за помощь, извините, решение было не более интересным и основанным на коде. Хотя мне легче оттого, что причиной не был мой код.

14
ответ дан 6 December 2019 в 06:02
поделиться

Я не думаю, что здесь достаточно информации, чтобы определить причину. Вы можете попробовать прочитать Руководство по устранению неполадок с основными данными ; одна из возможных причин может заключаться в том, что вы инициализировали этот конкретный экземпляр Puzzle, используя простой init, а не initWithEntity.

1
ответ дан 6 December 2019 в 06:02
поделиться

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

Попробуйте воспользоваться удобными действиями в разделе Design -> Data Model -> Copy Objective-C ... декларации/реализации методов в буфер обмена (при редактировании файла модели).

1
ответ дан 6 December 2019 в 06:02
поделиться

У этого управляемого объекта нет атрибут с именем « bestTime ». Согласно сообщению об исключении, это определенно головоломка, поэтому вы не объявили атрибут с именем bestTime в своей модели (или вы написали его с ошибкой или написали с заглавной буквы по-другому).

12
ответ дан 6 December 2019 в 06:02
поделиться