2014-01-05 44 views
0

感谢凯文的链接,这解决了我遇到的第一个问题,所以我现在已经改变这只是为了专注于我剩下的问题。iOS核心数据保存在不同的对象ID的

我有一个调查问卷应用程序,它有6个屏幕布局如此。

  • 欢迎屏幕与用户名的输入,出生日期
  • 问题1
  • 问题2
  • 问题3
  • 问题4
  • 谢谢你的屏幕

这个问题我我的意思是,从每个屏幕保存的数据都保存在我的c中的不同对象ID中矿石数据,而不是一个。

下面是我的意思是使用应用程序核心数据编辑器的屏幕截图。

EDIT

这里如何在每个控制器中保存数据。

// 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

可能重复的[用于打开存储该模型与用于创建存储在一个不兼容](http://stackoverflow.com/questions/8881453/the-model-used-to-open -the-store-is-incompatible-one-one-used-to-the-the) – Kevin

+0

嘿,我编辑了我的答案。检查它 –

+1

谢谢@achievelimitless我确实认为这可能是答案...我会给它一个去看看它是否有效。 – Gethin

回答

0

您必须执行数据模型的版本控制。更好的是,这里是一个快速修复..复制内容&您的模拟器的设置。如果可能,请删除应用程序文件夹中的所有文件。这发生在您的模型版本已被更改。详细了解版本号here

Here is a tutorial

编辑
回答您的更新问题是,你正在创建的viewController每一个新条目。更好地处理来自其他类的数据&将它保存到第4个viewController后的数据模型中。让我知道如果它没有帮助。

EDIT2
这里你不需要跟踪按下哪个按钮在哪里。 做一件事,在您的应用程序委托中创建托管对象。现在,当点击按钮时,从每个视图控制器中调用该对象,更新同一对象中的数据。在上次VC中,使用上下文保存对象..它应该工作.. :)

这是代码; in AppDelegate.h: @property NSManagedObject *q4;

in AppDelegate。玛(在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 
+0

好,所以我认为这就是我应该这样做的方式,但我想不出如何。 在我的每个视图中,我都有这样的代码来获得哪个按钮被按下,然后将其保存为数据,我将如何找出哪个按钮是从以前的视图中按下的? – Gethin

+0

我已经更新了我的答案。请检查 –

+0

我已经在我的答案中编写了代码。核实。代码中可能会出现愚蠢的错误。你可以检查它。目前没有MAC –

0

@achievelimitless是正确的。完成所有问题后保存。无论如何,你的应用程序的行为应该依赖于用户的期望。也许4个问题可以确定,但100个问题呢?如果用户在第二个问题后停止或关闭应用程序会怎么样?这样,他会再次重复提问。

因此,稍作修改就可以将每个问卷会话关联一个标识符。通过标识符(和用户标识,而不是名称),您可以获取特定的行并对其进行修改。

更新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]; 
+0

如何查看在我的最终视图中从所有视图中按下哪些按钮?我会在我的每个视图中粘贴我的代码... – Gethin

+0

我试过你说的@achievelimitless我似乎无法让它完全正常工作。您究竟如何将每个视图按下的按钮保存到托管对象? – Gethin

+0

这是否在每个视图控制器.h文件? '@属性(非原子,强)NSManagedObject * currentQuestionnaire;' 和与此代码.. 'nextViewController.currentQuestionnaire = [自currentQuestionnaire];' 我发现了,因为第一 'currentQuestionnaire' 的说法的误差“在”Q1ViewController“类型的对象上找不到”property'currentQuestionnaire' @flexaddicted – Gethin