我在这里有一个CoreData应用程序(没有基于文档的),1个实体和1个tableview用于编辑/添加/删除实体的“实例”。现在我可以手动添加和保存,但我想
a)
自动保存更改b
)在第一次启动时自动添加一些“实例”。
我认为a)
可以通过NSNotifications解决。但实体使用哪种?
如何解决a)
或b)
?
感谢every
回答。 =)
答案 0 :(得分:1)
自动保存可能比您有时期望的有点棘手,因为有时您的应用程序数据处于无效状态(例如,当用户正在编辑实体时)并且无法保存或无法保存保存是没有意义的。遗憾的是,没有简单的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." );
}
答案 1 :(得分:0)
在Apple Mailing列表中查看有关自动保存和核心数据的this thread。