【发布时间】:2017-10-18 11:52:12
【问题描述】:
我对创建 iOS 应用程序完全陌生。我必须快速创建一个表单应用程序,我可以在其中存储愿意填写的人的信息。基本上只是一堆用于姓名、邮件等内容的文本字段。
填写完表格后,我将使用以下代码存储他们的数据:
//Save action
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Person" inManagedObjectContext: context];
NSManagedObject *newPerson = [[NSManagedObject alloc]initWithEntity:entityDesc insertIntoManagedObjectContext:context];
//Fill in values
[newPerson setValue:self.btnPrefix.titleLabel.text forKey: @"prefix"];
[newPerson setValue:self.txtFirstName.text forKey: @"firstname"];
[newPerson setValue:self.txtLastName.text forKey: @"lastname"];
[newPerson setValue:self.txtLive.text forKey: @"country"];
[newPerson setValue:self.txtMail.text forKey: @"email"];
[newPerson setValue:self.txtPhone.text forKey: @"phonenumber"];
[newPerson setValue:self.txtLinked.text forKey: @"linkedIn"];
[newPerson setValue:self.txtAbout.text forKey: @"about"];
NSError *error;
[context save:&error];
在模拟器上执行时完全没有问题。但是一旦在 iPad 上运行,我就会得到这个错误:
由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'+entityForName:nil 不是 搜索实体名称的合法 NSManagedObjectContext 参数 “人”
调试后在第一行触发:
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"Person" inManagedObjectContext: context];
经过更多研究,我的 Appdelegate 在设备上运行时包含一个 nil persistentContainer,但在虚拟设备上运行时它被填充。所以我猜问题就在那里,但我找不到解决方法。
- (void)viewDidLoad {
[super viewDidLoad];
AppDelegate *appdelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];
context = appdelegate.persistentContainer.viewContext;
}
谁能帮帮我?
【问题讨论】:
-
错误告诉你,你的
context参数是nil,一定不是这样。你如何得到你在那里传递的托管对象上下文对象?我假设你已经确保你的模型确实包含一个名为“Person”的实体,对吧? -
在 viewDidLoad
AppDelegate *appdelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate]; context = appdelegate.persistentContainer.viewContext;下。是的,我有一个包含实体 Person 的模型。正如我所说,它可以在模拟器上运行,所以我想只是缺少一些东西才能让它在物理设备上运行? -
经过一番研究,我的 Appdelegate 在设备上运行时包含一个 nil persistentContainer,但在虚拟设备上运行时它已被填充。所以我想问题就在那里,但我找不到解决方法。
-
我假设您只是在为核心数据使用标准模板。那么为什么不看看你的应用程序代理默认的
persistentContainer方法呢?听起来您要么尝试在设备上没有写入权限的位置启动容器(模拟器通常在各个地方具有更多写入权限),要么您正面临设备上的竞速条件(您的视图控制器尝试在loadPersistentStoresWithCompletionHandler:方法完成之前访问容器和上下文)。 -
没问题,在我看来,问这个问题有点“早”,但我意识到什么是“太早”,什么不取决于个人,而且你确实说你是新人。我很高兴你找到了这个问题的根源,我想现在你可以看到,对于那些没有你的项目并且有过类似经历的人来说,这很难弄清楚。我想防止您得出这样的结论:SO 上的人“高于”帮助新的编码员。 :) 再说一次,我很高兴你自己想出来了。
标签: ios objective-c ipad core-data