我现在正在构建基于Core Data的iOS应用程序,当我尝试通过在[NSEntityDescription insertNewObjectForEintityForName:@"myModel" inManagedObjectContext:_managedObjectContext];
内执行AppDelegate.m
来插入新的托管对象时,我收到了标题中描述的错误。
这是我的AppDelegate.h
文件:
#import
@interface AppDelegate : UIResponder
@property (strong, nonatomic) UIWindow *window;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
// maybe required?
//@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
@end
这是我的AppDelegate.m
文件(仅显示相关部分):
#import "AppDelegate.h"
#import "MyModel.h"
#import "listViewController.h"
@implementation AppDelegate
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//managed object context settings
UITabBarController *tabbarController = (UITabBarController *)self.window.rootViewController;
UINavigationController *navigationController = [[tabbarController viewControllers] objectAtIndex:0];
listViewController *listcontroller = [[navigationController viewControllers] objectAtIndex:0];
listcontroller.managedObjectContext = self.managedObjectContext;
NSLog(@"%@", _persistentStoreCoordinator.managedObjectModel);
MyModel *newMyModel = [NSEntityDescription insertNewObjectForEntityForName:@"MyModel" inManagedObjectContext:_managedObjectContext];
return YES;
}
在这个应用程序中,我想使用tabbar控制器作为根视图控制器,当应用程序启动时,我想将导航控制器作为tabbar控制器的根视图控制器,并使用tableview控制器作为导航控制器的根视图控制器。在表视图控制器中,我想使用Core Data功能向用户显示许多实体。
如果我在NSLog()
输出的确切位置使用了断点,则它不会返回任何错误。当我向前移动一行输出日志消息时,以下输出返回:
() isEditable 0, entities {
}, fetch request templates {
}
这意味着由于某些原因我没有实体。
那么为什么在这种情况下没有实体呢?从this answer这里开始,我没有拼错我的实体名称。另外,我的objectModelContext未设置为nil。我是否设置了错误的托管对象?我在didFinishLaunchingWithOptions
方法的前三行中做错了吗?
或者是否存在导致问题的原因?或者我错过了什么?
我使用的是iOS 7和Xcode 5,我的实体中没有任何托管对象 - 毕竟,当我尝试实例化这些托管对象时发生了错误。
感谢。
答案 0 :(得分:2)
正如上面的评论中所讨论的,您可能需要检查ManagedObjectModel
的初始化方式。
我个人建议避免将Core Data代码直接放在你的app代理中 - 我不认为Apple的模板做得很好。查看this blog post作为设置核心数据堆栈所需的最少代码量的一个很好的示例,以及每个部分所做的简要说明。
关于您的额外评论问题 - 只要您访问managedObjectContext
属性,就会调用您拥有的managedObjectContext
方法。所以,当你这样做时:
listcontroller.managedObjectContext = self.managedObjectContext;
这会调用managedObjectContext
上的self
方法,(如果我没记错的话)将初始化您的上下文。