Обновление управляемого объекта в Базовых данных - PullRequest
1 голос
/ 28 июля 2011

Что у меня так далеко:

В одном splitview у меня есть табличное представление в качестве его мастера и UIView в качестве детализации. Табличное представление имеет 2 столбца: «Дни», а затем «Сеансы». Я получаю данные из Базовых данных, сущностей, называемых «Сеансами». Когда я нажимаю на ячейку таблицы «Сеанс», подробный вид обновляется.

В подробном представлении я добавил кнопку «Добавить» на панели навигации. Когда вы нажимаете на это, я добавляю новую сущность с именем «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 выбирает сущность "NewSession", получает все данные и отображает их.

ПРОБЛЕМА:

Всякий раз, когда я выхожу из приложения и перезапускаю его, сеансы в другом разделенном представлении все еще там, НО я могу снова добавить ТО ЖЕ сеанс.

В коде «add» у меня есть следующее:

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

Теперь мои sessionData - это NSManagedObject; и я думал, что просто установка значений обновит их в основных данных.

Может кто-нибудь помочь?

1 Ответ

1 голос
/ 28 июля 2011

У меня была похожая проблема, но похоже не означает то же самое . Я не знаю, работает ли это для вас, но вы можете попробовать это. Этот метод был описан мне @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];
}
...