0

好的,所以我正在尝试为我的应用程序构建这个统计跟踪器,并且我已经构建了一个名为 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;id:0x3e1e1b0;数据:) 2010-05-19 11:30:38.173 verses[29526:207] *** 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[valueForUndefinedKey:] :实体 StatTracker 不符合键“timesLauched”的键值编码。2010-05-19 11:30:38.174 诗句[29526:207] 堆栈:(

4

1 回答 1

1

好的,首先代码中有几个错误。你调用 alloc init的 theNSArray和 theNSNumber只是被下一行的赋值丢弃了。因此,那些应该从生活开始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”

简单的错字。我什至将您的错字复制到我的代码版本中:)

于 2010-05-19T14:58:08.100 回答