更新Core Data中的managedObject

时间:2011-07-28 15:47:25

标签: objective-c core-data entity nsfetchrequest

我有多远:

在一个splitview中,我有一个tableview作为它的主,一个UIView作为细节。 tableview有两列:“Days”,然后是“Sessions”。我从Core Data获得了数据,这些实体称为“Sessions”。当我点击“会话”表格视图时,详细视图会更新。

在详细视图中,我在导航栏中添加了“添加”按钮。单击此按钮时,我会向核心数据添加一个名为“NewSession”的新实体。

if ([_sessionData.added isEqualToNumber:[NSNumber numberWithBool:NO]]) {

        [_sessionData setValue:[NSNumber numberWithBool:YES] forKey:@"added"];

    SessionData *session = (SessionData*) [NSEntityDescription insertNewObjectForEntityForName:@"NewSessions" inManagedObjectContext:[DataSingleton sharedMySingleton].managedObjectContext];

    session.startDate = _sessionData.startDate;
    session.endDate = _sessionData.endDate;
    session.sessionLocation = nil;
    session.sessionTitle = _sessionData.sessionTitle;
    session.sessionDescription = _sessionData.sessionDescription;
    [session setValue: [NSNumber numberWithBool:YES] forKey:@"added"];

    _addButton =  [[[UIBarButtonItem alloc] initWithTitle:@"Remove" style:UIBarButtonSystemItemAdd target:self action:nil] autorelease];
    NSError *error = nil;

            if (![[DataSingleton sharedMySingleton].managedObjectContext save:&error]) {
                DebugLog(@"Whoops, couldn't save:%@", [error localizedDescription]);
            }
    }
    else {
        NSLog(@"SESSION ALREADY ADDED");
    }

另一个splitview的tableview获取“NewSession”实体,并获取所有数据并显示它。

问题:

每当我退出应用程序并重新启动它时,其他splitview中的会话仍然存在,但我可以再次添加SAME会话。

在“添加”代码中,我有以下内容:

[_sessionData setValue:[NSNumber numberWithBool:YES] forKey:@"added"];

现在,我的sessionData是一个NSManagedObject;我认为只需设置值就会在核心数据中更新它们。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我有类似的问题,但类似的并不意味着相同的。我不知道它是否适合你,但你可以尝试一下。 @macbirdie向我描述了这种方法,它对我有用。

首先,导入AppDelegate头文件

#import "YourAppDelegate.h"

然后,更新您的代码:

if ([_sessionData.added isEqualToNumber:[NSNumber numberWithBool:NO]]) {

    [_sessionData setValue:[NSNumber numberWithBool:YES] forKey:@"added"];

    NSManagedObjectContext *moc = [[DataSingleton sharedMySingleton] managedObjectContext];

    SessionData *session = (SessionData*) [NSEntityDescription insertNewObjectForEntityForName:@"NewSessions" inManagedObjectContext:moc];

    session.startDate = _sessionData.startDate;
    session.endDate = _sessionData.endDate;
    session.sessionLocation = nil;
    session.sessionTitle = _sessionData.sessionTitle;
    session.sessionDescription = _sessionData.sessionDescription;
    session.added = [NSNumber numberWithBool:YES];

    _addButton =  [[[UIBarButtonItem alloc] initWithTitle:@"Remove" style:UIBarButtonSystemItemAdd target:self action:nil] autorelease];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveMoc:) name:NSManagedObjectContextDidSaveNotification object:moc];

    NSError *error = nil;

    if (![moc save:&error]) {
        DebugLog(@"Whoops, couldn't save:%@", [error localizedDescription]);
    }

} else {
    NSLog(@"SESSION ALREADY ADDED");
}

在文件的某处添加此方法

- (void)saveMoc:(NSNotification *)notification {
    YourAppDelegate *appDel = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
    [appDel.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}