2010-08-06 4 views
6
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, которую я делаю, и я использую основные данные для хранения уровней. Когда уровень завершен и выигран, я хочу установить лучшее время для этого уровня. Выбранное время рассчитывается, и если оно лучше предыдущего наилучшего времени, я хочу установить его как лучшее время для уровня.Объект не соответствует ключевому значению для кода

Этот код выходит из строя в строке «int bestTime», когда он пытается извлечь наилучшее время из self.puzzle, который является NSManagedObject из Core Data. Лучшее время хранится как Integer 32 в модели Core Data. Ошибка с ошибкой SIGABRT.

'[<NSManagedObject 0x95334d0> valueForUndefinedKey:]: the entity Puzzle is not key value coding-compliant for the key "bestTime".' 

Я искал в Интернете по причинам, почему это происходит и как это исправить, но ничего не помогло. Существуют и другие места, где я получаю доступ к значениям Integer из модели 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]; 
+0

Это свойство 'bestTime', которое вы добавили в свою модель позже? То есть может ли это быть проблемой миграции? –

+0

Я добавил его позже, но я удалил приложение из симулятора и снова установил его. – danpalmer

+0

Я также сбросил содержимое и настройки симулятора, и он все еще не работает. Такая же ошибка, как и раньше. – danpalmer

ответ

14

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

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

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

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

+0

Я видел эту проблему много недавно, и большую часть времени она, похоже, вызвана пакетом приложений в симуляторе, сохраняющим старый файл .mom из предыдущей версии модели данных. По какой-то причине он не всегда очищается, когда модель изменяется. Перезагрузка машины заставила симулятор построить совершенно новый каталог приложений, разрешив проблему. Удаление приложения из симулятора также исправит его. – TechZen

+0

Я попытался удалить приложение в симуляторе. Проблема заключалась в том, что Xcode думал, что он ввел атрибут «bestTime», но фактически не сделал этого. – danpalmer

+1

Помогла перезагрузка OS X. Спасибо. Перезапуск Xcode, очистка кода или удаление приложения с устройства не помогли. При перезапуске Xcode после перезапуска OS X разница модели была очевидной, и на этот раз она вела себя. Спасибо за подсказку! –

11

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

+0

Я определил «bestTime» в файле xcdatamodel в моем проекте так же, как и все другие вещи, к которым я обращаюсь. Я попытался скопировать и вставить имя непосредственно из этого файла. – danpalmer

+0

Определенно ли это в том же объекте, к которому вы пытаетесь получить доступ? – Joshua

+0

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

1

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

+0

Я посмотрю на это. Благодарю. Что касается инициализации, я не знаю. Я выполнил запрос на выборку в моем контексте управляемых объектов и поместил результаты в изменяемый словарь. Объект просто берется из того, на котором нажимается tableviewcell. – danpalmer

+0

danpalmer: Измените свой вопрос, чтобы включить запрос на выборку. –

1

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

Простые удобные действия, предусмотренные в дизайне -> Модель данных -> Копировать Objective-C ... Объявления/Реализации метода в буфер обмена (при редактировании файла модели).

+0

Головоломка - это не класс, который я наследовал от NSManagedObject, это просто NSManagedObject. Из того, что я прочитал о Core Data, это хороший способ сделать это, если у вас нет кода, который нужно запустить на объекте. Для меня это просто набор свойств. Вот и все. – danpalmer

2

Я решил решить эту проблему, удалив и снова создав модель данных и очистив, а затем снова восстановим. Я думаю, что ошибка вызвана данными ядра, иногда не обновляет некоторые данные.

0

Если синтаксический анализ JSON в управляемом объекте, убедитесь, что вы используете свойство coreDataPropertyName, а не ключ json-key-name от JSON. Легко смешивать, когда их называют так же.

Эта ошибка приводила меня в норму, и все потому, что я использовал image-url, а не imageURL.

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