核心数据应用中的“保存”

时间:2009-01-30 16:16:48

标签: objective-c cocoa core-data

我在这里有一个CoreData应用程序(没有基于文档的),1个实体和1个tableview用于编辑/添加/删除实体的“实例”。现在我可以手动添加和保存,但我想

  

a)自动保存更改   b)在第一次启动时自动添加一些“实例”。

我认为a)可以通过NSNotifications解决。但实体使用哪种?

如何解决a)b)

的任何想法

感谢every回答。 =)

2 个答案:

答案 0 :(得分:1)

自动保存可能比您有时期望的有点棘手,因为有时您的应用程序数据处于无效状态(例如,当用户正在编辑实体时)并且无法保存或无法保存保存是没有意义的。遗憾的是,没有简单的setAutosaves:YES属性,所以你必须自己实现它。在某些操作之后使用通知保存是一种方法,您还可以设置一个计时器,以便在您的应用程序有意义时定期保存。

要填充空数据文件,只需检查数据存储在启动时是否为空(applicationDidFinishLaunchingawakeFromNib是放置此数据的两个可能位置),如果是插入一些实体像平常一样。唯一棘手的部分是在此过程中禁用撤消管理。以下是我的一个应用程序的示例:

- (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." );
}

答案 1 :(得分:0)

在Apple Mailing列表中查看有关自动保存和核心数据的this thread