2011-04-18 19 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

相關問題