2012-03-19 125 views
6

我開始在我的應用程序中使用CoreData關於使用iOS 5的新類UIManagedDocument的斯坦福CS193P課程中的CoreData。該方法本身非常簡單,但我無法理解如何處理我繼續進行的模型修改。這是我實例化我的UIManagedDocument對象(的appDelegate內,讓每一個其他類都可以使用它):UIManagedDocument遷移問題

if (!self.database) { 
    NSURL *url=[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    url = [url URLByAppendingPathComponent:@"AppName"]; 

    UIManagedDocument *doc = [[UIManagedDocument alloc] initWithFileURL:url]; 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 
    doc.persistentStoreOptions = options; 
    self.database=doc; 
    [doc release]; 
} 

這個問題我有是,每次我改變我的.xcdatamodel的哪怕是一點點,我我無法獲得先前存儲在文檔中的所有內容,也無法創建任何新實例。其實這樣做產生以下異常的問題:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.' 

我想設置管理文檔的「選項」屬性將已經解決了這個問題,但顯然這是不夠的。 任何人都可以提供幫助嗎?無法找到其他符合我的確切需求的問題。

+0

我也跟着斯坦福CS193P,而且我遇到了同樣的錯誤。 – coolcool1994 2013-07-01 22:09:09

回答

2

在修改Core Data模型之前,應該「添加模型版本」。

1. 選擇原始模型文件。 (例如YourProject.xcdatamodel)

2. 「Editor」 - >「Add Model Version ...」。然後添加一個新的模型版本(例如2.0)

3. 您將得到一個新的模型文件。 (例如YourProject 2.0.xcdatamodel)。修改它。

4. 更改當前的型號版本。選擇頂部的.xcdtatmodel文件 - >「查看」 - >「實用程序」 - >「顯示文件檢查器」。找到標記「Versioned Core Data Model」並選擇要修改的正確版本。

它也打擾了我很長一段時間。希望這種方式可以幫助你^^

+0

嗨。謝謝你的答案。似乎是最好的方式。總之,按照你的建議後,我不斷收到遷移問題: ***終止應用程序由於未捕獲的異常「NSInvalidArgumentException」,理由是:「不能與兩個不同的實體合併模型命名爲「ManagedChild」 其中ManagedChild是我的模型中的一個實體。我發現這個[條目](http://stackoverflow.com/questions/3205783/core-data-error-cant-merge-models-with-two-different-entities-named-foo),但它不使用samy UIManagedDocument方法,因爲我需要... – micamoita 2012-04-02 10:15:47

+0

我遇到同樣的問題。所有的文檔都表示,添加「persistentStoreOptions」是要走的路。但是我從UIManagedDocument獲得了一個無返回值以及相同的錯誤消息。刪除商店對我來說不是一個有效的選擇,因爲我支持已發佈的應用程序。 – 2014-05-09 02:50:58

+0

只是另一個數據點...我創建了一個示例項目,它通過UIManagedDocument初始化Core Data,就像我在我的應用程序中一樣,但示例項目似乎遷移得很好(即使沒有任何persistentStoreOptions)。 – 2014-05-09 05:53:03

0

有一個非常簡單的解決方案,您的問題。只需從模擬器或設備上擦除應用程序(觸摸應用程序圖標幾秒鐘,然後觸摸應用程序圖標開始擺動時出現的十字)。這樣,Xcode更新您的應用程序的UIManagedDocument。

+1

以及如果該應用程序已在商店中,該怎麼辦。你顯示一個警報視圖,並要求用戶重新安裝你的應用程序? – MrBr 2012-09-04 09:51:35

+0

我認爲pH-k的答案是提問者需要的,因爲他遵循教程,而不是將應用程序發佈到商店:) – Philip007 2012-11-15 07:05:40

+0

這並沒有幫助我。持久性商店是不可用的,但我明顯擁有它! – coolcool1994 2013-07-02 15:01:25

0

確保您沒有鍵入NSDocumentDirectory作爲NSDocumentationDirectory。

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 

NSDocumentDirectory是對的!