«Сохранить» в CoreData-приложениях - PullRequest
0 голосов
/ 30 января 2009

Здесь у меня есть приложение CoreData (без документов), 1 сущность и 1 табличное представление для редактирования / добавления / удаления «экземпляров» сущности. Теперь я могу добавить и сохранить вручную, но я бы хотел

a) автоматически сохранять изменения
b) автоматически добавить несколько «экземпляров» при первом запуске.

Я думаю, a) можно решить с помощью NSNotifications. Но что использовать сущностям?

Есть идеи как решить a) или b)?

Спасибо за every ответ. =) * * 1 018

Ответы [ 2 ]

1 голос
/ 30 января 2009

Автосохранение может быть немного сложнее, чем вы могли бы сначала ожидать, так как могут быть моменты, когда данные вашего приложения находятся в недопустимом состоянии (например, когда пользователь редактирует объект) и либо не могут быть сохранены, либо не имеет смысла экономить. К сожалению, нет простого свойства setAutosaves:YES, поэтому вам придется реализовать его самостоятельно. Использование уведомления для сохранения после определенных действий - это один из способов сделать это, вы также можете настроить таймер для периодического сохранения, если это имеет смысл для вашего приложения.

Чтобы заполнить пустой файл данных, просто проверьте, является ли хранилище данных пустым при запуске (applicationDidFinishLaunching и awakeFromNib - два возможных места для этого), и если оно вставляет некоторые объекты как обычно. Единственная сложность - отключение управления отменой во время процесса. Вот пример из одного из моих приложений:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification;
{       
    NSURL *fileURL = [NSURL fileURLWithPath:[self.applicationSupportFolder stringByAppendingPathComponent:WLDataFileName]];

    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];    
    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];

    [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:fileURL options:nil error:NULL];
    [context setPersistentStoreCoordinator:coordinator];
    [request setEntity:[NSEntityDescription entityForName:@"Shelf" inManagedObjectContext:context]];

    if ( [context countForFetchRequest:request error:NULL] == 0 )
        [self _populateEmptyDataStore:context];

    _managedObjectContext = [context retain];

    [request release];
    [coordinator release];
    [context release];

    // finish loading UI, etc...
}

- (void)_populateEmptyDataStore:(NSManagedObjectContext *)context;
{
    [[context undoManager] disableUndoRegistration];

    WLSmartShelfEntity *allItems = [NSEntityDescription insertNewObjectForEntityForName:@"SmartShelf" inManagedObjectContext:context];
    WLSmartShelfEntity *trash = [NSEntityDescription insertNewObjectForEntityForName:@"SmartShelf" inManagedObjectContext:context];

    allItems.name = NSLocalizedString( @"All Items", @"" );
    allItems.predicate = [NSPredicate predicateWithFormat:@"isTrash = FALSE"];
    allItems.sortOrder = [NSNumber numberWithInteger:0];
    allItems.editable = [NSNumber numberWithBool:NO];

    trash.name = NSLocalizedString( @"Trash", @"" );
    trash.predicate = [NSPredicate predicateWithFormat:@"isTrash = TRUE"];
    trash.sortOrder = [NSNumber numberWithInteger:2];
    trash.editable = [NSNumber numberWithBool:NO];

    [context processPendingChanges];
    [[context undoManager] enableUndoRegistration];

    DebugLog( @"Filled empty data store with initial values." );
}
0 голосов
/ 30 января 2009

Просмотрите эту ветку в списках рассылки Apple, касающихся автосохранения и основных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...