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