Автосохранение может быть немного сложнее, чем вы могли бы сначала ожидать, так как могут быть моменты, когда данные вашего приложения находятся в недопустимом состоянии (например, когда пользователь редактирует объект) и либо не могут быть сохранены, либо не имеет смысла экономить. К сожалению, нет простого свойства 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." );
}