使用核心数据时出错

时间:2011-12-25 10:58:25

标签: iphone objective-c ios5

你好我正在尝试使用核心数据来读写用户数据。 我正在使用的代码如下:

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)       终止叫做抛出异常

3 个答案:

答案 0 :(得分:2)

您的appDelegate没有像错误中那样的managedObjectContext方法。

修改

看看这些链接:
Ray Wenderlich Blog
Cocoa Dev Central
Mobile Tuts

如果没有这些,你可以随时Google it:)

答案 1 :(得分:1)

您似乎还没有合成您的财产

添加

@synthesize managedObjectContext;

到您的AppDelegate.m文件

修改 我以为你只是忘了初始化你的属性,但似乎你刚刚开始学习CoreData。

学习如何初始化CoreData的更有效方法是研究Apple提供的defaut实现的代码。创建一个新项目,然后在向导中选择使用CoreData。您将获得一个正常工作的代码,并看到被覆盖的两个setter。在第一次调用时,私有属性被初始化。这是延迟加载,在第一次需要时初始化。

您还应该阅读CoreData starting point,尤其是CoreData programming guide

答案 2 :(得分:1)

为什么不在Xcode中创建新项目并在向导中选择“Core Data”复选框?然后,Xcode将为您创建一个使用Core Data的新项目。您通常不必自己设置Core Data。