使用核心数据时出错
Posted
技术标签:
【中文标题】使用核心数据时出错【英文标题】:error when using core data 【发布时间】:2011-12-25 10:58:24 【问题描述】:您好,我正在尝试使用核心数据来读取和写入用户数据。 我使用的代码如下:
AppDelegate 接口
@interface PopAdsAppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>
@private
NSManagedObjectContext *managedObjectContext_;
NSManagedObjectModel *managedObjectModel_;
NSPersistentStoreCoordinator *persistentStoreCoordinator_;
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UITabBarController *tabBarController;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@end
我遇到错误的代码在 .m 文件中:
PopAdsAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"User" inManagedObjectContext:context];
这一行具体
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"User" inManagedObjectContext:context];
我拥有的 .xcdatamodeld 文件名为 UserData.xcdatamodeld
,并且我拥有名为“用户”的实体。
说实话,我不知道我应该在代码的哪个位置提供UserData.xcdatamodeld
文件名?!!我在示例中看到的只是实体名称!
我得到的错误是:
[PopAdsAppDelegate managedObjectContext]:无法识别的选择器发送到实例 0x180d60 2011-12-25 13:36:37.008 PopAds2 [15645:707] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[PopAdsAppDelegate managedObjectContext]:无法识别的选择器发送到实例 0x180d60” * 首先抛出调用栈: (0x3435f8bf 0x345af1e5 0x34362acb 0x34361945 0x342bc680 0x3c87 0x41a9 0x35d6bc39 0x35cc36e9 0x35cc36b3 0x35cc35d5 0x323718a5 0x32366545 0x32366639 0x32366243 0x32366179 0x34333b03 0x343332cf 0x34332075 0x342b54dd 0x342b53a5 0x30b39fcd 0x37736743 0x305d 0x2ff4) 终止称为抛出异常终止
【问题讨论】:
【参考方案1】:您的 appDelegate 没有从错误中显示的 managedObjectContext 方法。
编辑:
看看这些链接:Ray Wenderlich BlogCocoa Dev CentralMobile Tuts 如果这些还不够,你可以随时Google it :)
【讨论】:
对不起,我对此完全陌生。您可以提供解决方案或解决方案的链接吗?谢谢 我确实按照@luxquarta 的建议合成了一些对象,但现在收到一条错误消息:'+entityForName: could not locate an NSManagedObjectModel for entity name 我注意到这一行 NSManagedObjectContext *context = [self managedObjectContext];不初始化对象上下文!任何想法 实际上您不需要在应用程序委托中合成这些对象,因为应该有初始化这些对象的方法。如果您正在合成它们,则不会调用这些方法并且不会初始化这些对象。尝试按照@cmk 的建议创建一个启用核心数据的新项目,然后看看这些东西是如何工作的。 如果我没记错的话,默认实现(Apple 提供的核心数据模板附带的那个)综合了 managedObjectContext 和 managedModel 但覆盖了 setter 以延迟初始化私有属性。 哦,我错误地宣布了我的想法。我的意思是,如果你忘记提供这样的自定义实现,默认(合成)getter 不会初始化任何东西。【参考方案2】:为什么不在 Xcode 中创建一个新项目并在向导中选中“Core Data”复选框?然后 Xcode 将为您创建一个使用 Core Data 的新项目。您通常不必自己设置 Core Data。
【讨论】:
当您需要将核心数据功能添加到已经运行了一段时间的项目时,您确实需要它...... :( 当然。但随后只需从模板中复制代码并将其粘贴到您的旧项目中并调整硬编码字符串。对于初学者来说应该比从头开始更容易。 这是一种通用方法,认为最好了解您在做什么而不是仅仅复制/粘贴,因为它会带来更好的解决方案(假设您还想预先发送一些数据,如在我的项目中,简单的复制/粘贴会错过目标) 在这种情况下,通过复制和粘贴更有可能获得有效的解决方案,然后应该更容易理解代码,因为它有效。尝试理解根本不起作用的东西要困难得多。但那只是我的个人意见。 :) 确实如此 :) 但是,嘿,我们不是在寻找简单的方法 ;)【参考方案3】:你的属性好像没有合成
添加
@synthesize managedObjectContext;
到您的 AppDelegate.m 文件
编辑 我以为你只是忘记初始化你的属性,但似乎你才刚刚开始学习 CoreData。
学习如何初始化 CoreData 更有效的方法是研究 Apple 提供的默认实现的代码。创建一个新项目并在向导中选择使用 CoreData。您将获得一个工作代码并看到两个设置器被覆盖。在第一次调用时,私有属性被初始化。这是延迟加载,第一次需要时初始化。
您还应该阅读CoreData starting point,尤其是CoreData programming guide
【讨论】:
@synthesize managedObjectContext = managedObjectContext_;如果我们正在谈论它。不要忘记对其他属性也这样做:) 是的,我注意到了,我确实合成了它们,但现在收到一条错误消息:'+entityForName: could not locate an NSManagedObjectModel for entity name 我注意到这一行 NSManagedObjectContext *context = [self managedObjectContext];不初始化对象上下文! [self managedObjectContext] 不初始化事物。它只是一个返回 managedObjectContext 的方法。如果你之前没有设置它会返回 nil。 我建议您使用 Apple 提供的模板创建一个新的 xCode 项目。例如空应用程序(应用程序部分的最后一个)。在向导的第二个屏幕上勾选 Use CoreData。打开委托并查看设置器 (NSManagedObjectContext *)managedObjectContext 和 - (NSManagedObjectModel *)managedObjectModel以上是关于使用核心数据时出错的主要内容,如果未能解决你的问题,请参考以下文章