感谢Kevin的链接,这解决了我遇到的第一个问题,所以我现在改变了这一点,只关注我剩下的问题。
我有一个问卷调查应用程序,它有6个屏幕,就像这样。
我遇到的问题是每个屏幕保存的数据都保存在我的核心数据中的不同对象ID中,而不是一个。
这是我使用应用程序核心数据编辑器的截图。
修改
这里如何在每个控制器中保存数据。
// Save Data
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSManagedObject *q4;
NSString *buttonPressed = [sender titleForState:UIControlStateNormal];
q4 = [NSEntityDescription insertNewObjectForEntityForName:@"Questionnaire" inManagedObjectContext:context];
[q4 setValue:buttonPressed forKey:@"q4"];
答案 0 :(得分:0)
您必须执行数据模型的版本控制。更好的是,这里是一个快速修复。重置内容&模拟器的设置。如果可能,请删除应用程序文件夹中的所有文件。当模型版本已更改时,会发生这种情况。了解有关版本控制here的更多信息。
修改强>
对于您更新的问题的答案是,您正在每个viewController中创建一个新条目。更好地处理来自其他课程的数据。在第4个viewController之后将它保存到数据模型中。如果没有帮助,请告诉我。
<强> EDIT2 强>
在这里,您无需跟踪按下哪个按钮。
做一件事,在你的app委托中创建托管对象。现在,当单击按钮时,从每个视图控制器调用该对象,&amp;更新同一对象中的数据。在最后一个VC中,使用上下文保存对象..它应该工作..:)
这是代码;
在AppDelegate.h中:
@property NSManagedObject *q4;
:(在didFinishLaunchingWithOptions中)
q4 = [NSEntityDescription insertNewObjectForEntityForName:@"Questionnaire" inManagedObjectContext:context];
现在在onClick方法的实现中调用这样的对象:
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
[[appDelegate Q4] setValue:buttonPressed forKey:@"q4"];
最后保存:
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
//here save using context
答案 1 :(得分:0)
@achievelimitless 是正确的。完成所有问题后,只需保存即可。无论如何,您的应用程序的行为应该依赖于用户的期望。也许4个问题可以,但100个问题怎么样?如果用户在第二个问题之后停止或关闭应用程序怎么办?通过这种方式,他将再次重复问题。
因此,稍加修改可以将每个调查问卷会话与标识符相关联。通过标识符(以及用户ID,而不是名称),您可以获取特定行,然后对其进行修改。
更新1
您遇到的问题是,在每个控制器中,您都会创建一个新的托管对象。
[NSEntityDescription insertNewObjectForEntityForName:@"Questionnaire" inManagedObjectContext:context];
因此,最后您将找到在应用程序中创建的对象数量。
我解决此问题的首选方法是将受管对象设置为一个,例如,在欢迎屏幕之后,然后在下次执行时将其传递给每个视图控制器。
nextViewController.currentQuestionnaire = [self currentQuestionnaire];
每个视图控制器都会公开一个属性,如
@property (nonatomic, strong) NSManagedObject* currentQuestionnaire;
当你到达终点时,你会做save
。您不需要访问应用程序委托来获取上下文,因为每个托管对象都知道上下文已注册。
[[[self currentQuestionnaire] managedObjectContext] save:&error];
或者(我不会遵循这种方法)您应该创建一个托管对象并将其作为引用放在应用程序委托中。通过这种方式,您可以使用
访问该对象NSManagedObjectContext *context = [appDelegate managedObjectContext];
换句话说,在每个控制器中
NSManagedObject* currentQuestionnaire = [appDelegate currentQuestionnaire];
// update or save here
更新2
您需要在每个视图控制器中添加每个属性。
因此,例如,Q1ViewController
将成为
@interface Q1ViewController : UIViewController
@property (nonatomic, strong) NSManagedObject* currentQuestionnaire;
@end
然后在此控制器中,当您准备好转到下一个视图控制器
时 [[self currentQuestionnaire] setValue:@"aValue" forKey:@"q1"];
Q2ViewController* nextController = // alloc init here
nextController.currentQuestionnaire = [self currentQuestionnaire];
必须在欢迎控制器中管理新问卷的创建。在这里,当您准备去问题1时,您需要执行以下操作。
NSManagedObject* currentQuestionnaire = [NSEntityDescription insertNewObjectForEntityForName:@"Questionnaire" inManagedObjectContext:context];
// set name and date for the currentQuestionnaire object
// also the screen controller could have a reference to the questionnaire,
// so it will have a property like declared above
self.currentQuestionnaire = currentQuestionnaire;
Q1ViewController* nextController = // alloc init here
nextController.currentQuestionnaire = [self currentQuestionnaire];