CD对我来说是一个巨大的学习曲线,对我而言还有一点点帮助,但是对于下面的任何帮助都可以使我解除当前的重量我的肩膀!在Core Data应用程序中另存为...的一种方法
我正试图编写一个方法,在我的CD应用程序中为用户实现“另存为..”。
到目前为止我有:
[saveAsPanel beginSheetModalForWindow:window completionHandler:^(NSInteger userResult)
{
if (userResult == NSOKButton) {
NSPersistentStoreCoordinator *psc = [self persistentStoreCoordinator];
NSURL *oldURL = [self URLOfInternalStore]; //returns the current store's URL
NSURL *newURL = [saveAsPanel URL];
NSError *error = nil;
NSPersistentStore *oldStore = [psc persistentStoreForURL:oldURL];
NSPersistentStore *sqLiteStore = [psc migratePersistentStore:oldStore
toURL:newURL
options:nil
withType:NSXMLStoreType
error:&error];
}
}];
不幸的是,我刚刚得到的错误:
对象的持久性存储是不是从这个NSManagedObjectContext中的协调到达。
我应该'删除'然后'addPersistentStore ...'将其更新到新的URL吗?该文件似乎表明,所有将采用“迁移”方法进行处理。
提前致谢!
编辑:
好了,好了,我拿出我自己的“脏”的方法。我可以想像,这不是做事情的经过批准的方式,但没有抛出了错误,并且应用程序的工作原理是在任何时候都预计(不经常,我可以说,无论是!):
-(IBAction)saveAsAction:(id)sender
{
NSSavePanel *saveAsPanel = [NSSavePanel savePanel];
[saveAsPanel beginSheetModalForWindow:window completionHandler:^(NSInteger userResult)
{
if (userResult == NSOKButton) {
[self saveAction:@"saveAsCalling"];
NSURL *newURL = [saveAsPanel URL];
NSError *error = nil;
[[NSFileManager defaultManager] copyItemAtURL:[NSURL fileURLWithPath:internalStore] toURL:newURL error:&error];
//internalStore is a hard-wired NSString that holds the path to the bundle's database
}
}];
}
-(IBAction)loadAction:(id)sender
{
NSOpenPanel *loadPanel = [NSOpenPanel openPanel];
[loadPanel beginSheetModalForWindow:window completionHandler:^(NSInteger userResult)
{
if (userResult == NSOKButton) {
[self saveAction:@"loadCalling"];
NSURL *newURL = [loadPanel URL];
NSURL *oldURL = [NSURL fileURLWithPath:internalStore];
NSError *error = nil;
NSPersistentStoreCoordinator *psc = [SELF_MOC persistentStoreCoordinator];
[psc removePersistentStore:[[self persistentStoreCoordinator] persistentStoreForURL:oldURL] error:&error];
[psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:newURL options:nil error:&error];
[[NSFileManager defaultManager] removeItemAtURL:oldURL error:&error];
[[NSFileManager defaultManager] copyItemAtURL:newURL toURL:oldURL error:&error];
[psc removePersistentStore:[[self persistentStoreCoordinator] persistentStoreForURL:newURL] error:&error];
[psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:oldURL options:nil error:&error];
}
}];
}
的基本的推理是:做一个'另存为...'我只需将mainBundle中的SQLLite存储文件复制到用户选择的任何地方,并将其重命名为他们想要的 - 按照TechZen的建议。
要做一个'加载',我首先从bundle的文件中删除PersistentStore,添加用户刚才选择的那个。删除捆绑存储(理论上现在不使用),然后将用户的选择复制回捆绑。最后,执行remove和addPersistentStore这两个操作,将应用程序指向它现在是用户选择的包的文件。
希望是有道理的。如果任何人有任何想法,这是多么不专业的方法,那么请 - 善良,因为我是相当新的 - 让我知道。我找不到更优雅的东西。
我知道苹果不喜欢你使用removePersistentStore和addPersistentStore,但是,正如我所说没有错误报告(在我的实际代码中,我散布NSLog行以报告错误持有)。
由于TechZen。所以有一种方法可能是做当前商店的基本文件副本..?我在网上看到有人关闭了当前窗口,复制了sql文件,然后重新打开了应用程序的窗口。他们承认这不是优雅! – Todd 2011-04-20 05:40:20
是的,只需复制持久存储就可以完成与“另存为...”一样的功能 – TechZen 2011-04-20 12:44:44
感谢TechZen,我在发布我的编辑后才看到您的评论。 – Todd 2011-04-20 22:36:47