iPhone OS: почему мой managedModelObject не соответствует кодированию значения ключа? - PullRequest
0 голосов
/ 19 мая 2010

Хорошо, поэтому я пытаюсь создать этот трекер статистики для своего приложения, и я создал объект модели данных с именем statTracker, который отслеживает все, что я хочу. Я могу устанавливать и извлекать значения с помощью селекторов, но если я пытаюсь использовать KVC (то есть setValue: forKey:), все идет плохо и говорит, что мой класс StatTracker не совместим с KVC:

valueForUndefinedKey:]: объект StatTracker не совместим со значением ключа для ключа "timesLauched". ' 2010-05-18 15: 55: 08.573

вот код, который его запускает:

NSArray *statTrackerArray = [[NSArray alloc] init];
statTrackerArray = [[CoreDataSingleton sharedCoreDataSingleton] getStatTracker];

NSNumber *number1 = [[NSNumber alloc] init];

number1 = [NSNumber numberWithInt:(1 + [[(StatTracker *)[statTrackerArray objectAtIndex:0] valueForKey:@"timesLauched"] intValue])];
[(StatTracker *)[statTrackerArray objectAtIndex:0] setValue:number1 forKey:@"timesLaunched" ];

NSError *error;
if (![[[CoreDataSingleton sharedCoreDataSingleton] managedObjectContext] save:&error]) {
    NSLog(@"error writing to db");
}

Не уверен, достаточно ли этого кода для вас, ребята, дайте мне знать, что вам нужно, если вам нужно больше.

Это было бы так мило, если бы я мог использовать KVC, потому что тогда я мог бы абстрагировать весь этот материал отслеживания статистики в один вызов метода со строковым аргументом для рассматриваемого значения. По крайней мере, это то, что я надеюсь сделать здесь. Сейчас я на самом деле понимаю всю мощь KVC, но сейчас я просто пытаюсь понять, как заставить его работать.

Спасибо!

Ник

После добавления кода, предложенного ниже, вывод будет таким:

Объект: (объект: StatTracker; идентификатор: 0x3e1e1b0; данные:) 2010-05-19 11: 30: 38.173 стихи [29526: 207] *** Завершение работы приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[valueForUndefinedKey:]: объект StatTracker не соответствует значению ключа, соответствующему кодированию для ключа "timesLauched". 2010-05-19 11: 30: 38.174 стихи [29526: 207] Стек: (

1 Ответ

1 голос
/ 19 мая 2010

Хорошо, сначала в коде есть пара ошибок. NSArray и NSNumber, для которых вы вызываете alloc init, просто отбрасываются назначением на следующей строке. Поэтому они должны начать жизнь как nil (или вы можете объединить две строки вместе).

Во-вторых, вам нужно взять указатель на NSManagedObject, чтобы вы могли взглянуть на него и убедиться, что это именно то, что вы думаете.

NSArray *statTrackerArray = nil;
statTrackerArray = [[CoreDataSingleton sharedCoreDataSingleton] getStatTracker];

NSNumber *number1 = nil;

id object = [statTrackerArray objectAtIndex:0];
NSLog(@"Object: %@", object);
NSInteger timesLaunched = [[object valueForKey:@"timesLauched"] intValue];
timesLaunched += 1;
number1 = [NSNumber numberWithInteger:timesLaunched];

[object setValue:number1 forKey:@"timesLaunched" ];

NSError *error = nil;
if (![[[CoreDataSingleton sharedCoreDataSingleton] managedObjectContext] save:&error]) {
  NSLog(@"error writing to db: %@\n%@", [error localizedDescription], [error userInfo]);
}

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

Я подозреваю, что ваш объект StatTracker не является правильным подклассом NSManagedObject.

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

Обновление

Свойство 'timesLaunched'

Вы пытаетесь открыть 'timesLauched'

Простая опечатка. Я даже скопировал вашу опечатку в мою версию вашего кода:)

...