使用ModalView通过CoreData保存数据

时间:2011-11-05 17:38:51

标签: iphone ios core-data modalviewcontroller

我的应用只是一个数据库,用户只需搜索一些科学数据。它的构建如下:

- 必须通过TabBarViewController选择“主”视图。 - 第一个视图是用户进入搜索查询的位置。 - secon视图只是一些设置,信息和免责声明信息。

我使用第二个视图预先填充将随应用程序一起发布的数据库。现在已经填充了,我将实际实现设置,信息等。

在AppDelegate(applicationDidFinish ...)中设置了managedObjectContext,如下所示:

 firstViewViewController.managedObjectContext = self.managedObjectContext; 
secondViewController.managedObjectContext = self.managedObjectContext;
saveCustom.managedObjectContext = self.managedObjectContext;

self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];

return YES;

在secondViewController中正确声明了managedObjectContext。

到目前为止,该应用程序工作正常,我可以将项目保存到数据库中。

现在,我创建了一个从firstViewController调用的modalView。我希望用户能够保存自定义数据。为此,我复制了我在seconViewController中所做的事情,并在AppDelegate中添加了相应的代码(或我认为的代码)(见上文)。

当我尝试使用modalVIew保存数据时,我收到以下错误。

*由于未捕获的异常'NSInternalInconsistencyException'而终止应用,原因:'+ entityForName:无法找到实体名称XXX的NSManagedObjectModel

其中XXX是我的实体的正确名称。

我知道这与托管的ObjectObjectContext没有被初始化有关。但我不明白为什么它在seconViewController上工作而不在modalViewController上。

那么,我怎样才能让它发挥作用呢?

我知道将AppDelegate导入到modalView,尽管它可行,但这不是一个好习惯。

提前致谢!

编辑:

我用来保存数据的代码如下:

-(void)saveDataToCD{

NSString *entityString=[NSString stringWithFormat:@"%@",[arrayAdquiritDelMV objectAtIndex:1]];
NSString *deltaString=[NSString stringWithFormat:@"%@",[arrayAdquiritDelMV objectAtIndex:3]];





    NSManagedObjectContext *context = [self managedObjectContext];

    NSManagedObject *pepe = [NSEntityDescription insertNewObjectForEntityForName:entityString inManagedObjectContext:context];  // aqui un string
    [pepe setValue:assigment.text forKey:@"definition"];
    [pepe setValue:impurity.text forKey:@"impurity"];
    [pepe setValue:[NSNumber numberWithDouble:[delta.text doubleValue]] forKey:deltaString];  //aquí un string


    NSError *error;


    if (![context save:&error]) 
    {
        NSLog(@"Problem saving: %@", [error localizedDescription]);
    }}

编辑#2,这是我调用模态视图的方式:

-(IBAction)saveCustom:(id)sender{

if(saveCustomController == nil)
{
    SaveCustom *viewTwo = [[SaveCustom alloc] initWithNibName:@"SaveCustom" bundle:[NSBundle mainBundle]];
    self.saveCustomController = viewTwo;

    [viewTwo release];
}

[self presentModalViewController:self.saveCustomController animated:YES];

}

1 个答案:

答案 0 :(得分:0)

根据您的描述,它看起来不像这样,但仍值得一试。

您是否在启动应用程序后修改了Core-Data模型? 如果是,则需要进入应用程序文件夹并删除Core-Data支持文件 因为它现在与您的模型不同步,核心数据不知道如何处理它。

唯一的疑问是,我在修改后启动应用程序时会收到该错误,而不是稍后2或3次查看。


如何以模态方式呈现该视图,在何处创建该视图以及在何处以模态方式呈现该视图的上下文?


你忘了告诉UIViewController使用什么上下文。

if(saveCustomController == nil)
{
SaveCustom *viewTwo = [[SaveCustom alloc] initWithNibName:@"SaveCustom" bundle:[NSBundle mainBundle]];
self.saveCustomController = viewTwo;

[viewTwo release];
}

[self presentModalViewController:self.saveCustomController animated:YES];

你错过了像这样的一行

viewTwo.managedContext = aManagedContext;

当您在applicationFinised中执行此操作时...您的实例尚不存在。
在Obj-C中,您可以向nil发送消息,它将被忽略,您不会像其他语言一样崩溃。