【问题标题】:iPhone OS: Why is my managedModelObject not complying with Key Value Coding?iPhone OS:为什么我的 managedModelObject 不符合键值编码?
【发布时间】:2010-05-18 23:15:03
【问题描述】:

好的,所以我正在尝试为我的应用程序构建这个统计跟踪器,并且我已经构建了一个名为 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 不符合键的键值编码“timeLauched”。 2010-05-19 11:30:38.174 诗句[29526:207] 堆栈:(

【问题讨论】:

    标签: iphone xcode core-data key-value-coding object-model


    【解决方案1】:

    好的,首先代码中有几个错误。您正在调用 alloc init 的 NSArrayNSNumber 只是被下一行的赋值丢弃了。因此,那些应该以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”

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

    【讨论】:

    • 嘿,感谢您查看此应用程序,我对这个应用程序非常感兴趣。或者至少现在感觉是这样,我需要构建一堆我什至不知道该怎么做的部分。我真的很感激帮助。至于 StatTracker 类,我只是使用 xcode 建模器构建它,没有在其中编写一行代码,它可能将它添加为可可管理对象而不是 UIKit 对象模型,不确定这是否会产生我们看到的差异,但我会尝试一下。 -再次感谢,尼克
    • 对 StatTracker 对象进行“重建”的结果相同。
    • 如果你添加了我上面的代码,你应该有一个以“Object:”开头的新日志语句,那一行是什么意思?
    • 2010-05-19 11:37:29.110 verses[29592:207] *** 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[ valueForUndefinedKey:]:实体 StatTracker 不符合键“timesLauched”的键值编码。 2010-05-19 11:37:29.111 诗句[29592:207] 堆栈:(
    • 天啊,我看了大概一分钟,还是没看到。非常感谢你,我认为这可能是那样的蹩脚的东西,看起来我做得对。再次感谢马库斯,希望我将来能以某种方式帮助你。 --尼克
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    相关资源
    最近更新 更多