2011-04-18 18 views
0

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行以报告错误持有)。

回答

0

您只能在基于文档的应用程序中使用SaveAs...。如果您使用Core Data作为您的模型,则需要使用NSPersistentDocument来保存您的数据。它提供您寻求的SaveAs...功能。

直核心数据被用于在其全部的应用程序从一个数据集进行操作多个数据库样的应用程序(或多或少)

+0

由于TechZen。所以有一种方法可能是做当前商店的基本文件副本..?我在网上看到有人关闭了当前窗口,复制了sql文件,然后重新打开了应用程序的窗口。他们承认这不是优雅! – Todd 2011-04-20 05:40:20

+0

是的,只需复制持久存储就可以完成与“另存为...”一样的功能 – TechZen 2011-04-20 12:44:44

+0

感谢TechZen,我在发布我的编辑后才看到您的评论。 – Todd 2011-04-20 22:36:47

相关问题