2011-07-17 83 views
1

我從來沒有任何問題與Xcode3,但與Xcode4我得到蘋果的代碼約3失敗時,我更新了一個核心數據模型,與可怕的「持久性存儲遷移失敗,丟失源託管對象模型。錯誤。如何在不破壞Xcode4的情況下正確更新模型?

這裏是我的設置(我是如何配置的項目爲自動遷移):

  1. NSPersistentDocument,從蘋果公司的模板
  2. 覆蓋蘋果的模式裝載方法,我唯一能做的是提供兩個標誌在storeOptions字典,這開啓自動遷移
-(BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error 
{ 

    NSMutableDictionary *newOptions = nil; 

    if(storeOptions != nil) 
     newOptions = [NSMutableDictionary dictionaryWithDictionary:storeOptions]; 
    else 
     newOptions = [NSMutableDictionary dictionary]; 

    [newOptions setValue:@"YES" forKey:NSMigratePersistentStoresAutomaticallyOption]; 
    [newOptions setValue:@"TRUE" forKey:NSInferMappingModelAutomaticallyOption]; 

    BOOL success = FALSE; 

    success = [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newOptions error:error]; 

    return success; 
} 

具體的過程我一直在使用(這是已經工作在Xcode4約1錯誤!)

  1. 選擇模型(Xcode4名爲‘something.xcdatamodel’,用曲折的左側)
  2. 進入編輯器菜單,選擇「添加新模型版本...」
  3. 命名新版本1整數比上一個更高 - 例如如果以前是「4」命名新的一個「5」
  4. 在右側窗格中,改變目前的模型版本,新創建的一個
  5. 解決方法XCode4錯誤:選擇任何文件,然後選擇新創建的模型。如果你不這樣做,Xcode會在新創建的模型上顯示選擇,但是會編輯以前的模型,這肯定會破壞CoreData中的所有內容。
  6. 編輯模型;在這種情況下,我正在向現有實體添加新屬性
  7. 保存。建立。跑。 ... CRASH。

除此之外,正如我所說的,在3中大約2次這個工作正確。一旦它工作了一次,它顯然是很好的 - 輕量級遷移完成後,下一次保存將保存在新的模型版本中。

所以我猜在上面的步驟中我做了一些錯誤的事情,但我已經通過了5次或6次的文檔,看不到任何明顯的東西。這對NSPersistentDocument文檔沒有任何幫助,但是我已經在iPhone上進行了很多次輕量級遷移,所以我對此相當有信心,而且這對我來說似乎是正確的。


其他的事情我已經試過/檢查: - iPhone Core Data Lightweight Migration Cocoa error 134130: Can't find model for source store(沒了;有人被納入只有根xcdatamodel)

+0

崩潰是否會產生任何錯誤? – TechZen

+0

您是否嘗試遷移開發版本? – TechZen

+0

您是否一遍又一遍地使用同一份商店副本,或者每次都是以新副本開始的? – TechZen

回答

0

既然你已經消除了腐敗發展的店作爲一個問題的根源,我懷疑這個問題存在於Xcode 4.x中,這是至少可以說的錯誤。很多人報告類似的問題,但沒有兩個問題看起來完全一樣。這可能是一個只在特定數據模型設置下才會出現的bug,因此這個問題很難追查到。

您可能只需放棄自動遷移並創建顯式遷移圖。它需要更長的時間,並將複雜性引入到您的代碼中,但它始終有效。

如果您有一個送貨應用程序,並且會在野外處理最終用戶數據,那麼您有道義上和業務上的義務採取額外步驟來保護最終用戶數據。

+0

我認爲你可能是對的 - 在Xcode4的CoreData處理中有很多明顯的錯誤,我只是希望有一些明顯的* I *做錯了 - 這會比不得不「希望和等待」讓蘋果修復它 – Adam

3

使用[NSNumber numberWithBool:YES]不是@"YES"@"TRUE"

+0

爲什麼會有所作爲?NSString的[boolValue]是內置的,並且與您提供的代碼完全相同地評估爲「YES」。 – Adam

+0

[NSNumber numberWithBool: x]將不會在你的NSString上調用boolValue,這是一個布爾值,它總是會計算爲true,即numberWithBool:@「NO」理論上仍然是YES(true)。 – lupinglade

0

我越來越超級困惑,但這個,它不工作..因爲我假設該方法將已經有一個「商店選項」字典..我只需要檢查它的存在之前,我設置前面提到的選項...

-(BOOL)configurePersistentStoreCoordinatorForURL:  (NSURL*)u 
              ofType: (NSString*)t 
           modelConfiguration: (NSString*)c 
            storeOptions:(NSDictionary*)o 
              error: (NSError**)e 
{ 
return [super configurePersistentStoreCoordinatorForURL:u 
                ofType:t 
             modelConfiguration:c 
              storeOptions: 
    o ? [o dictionaryWithValuesForKeys: 
     @[ NSMigratePersistentStoresAutomaticallyOption, @YES, 
      NSInferMappingModelAutomaticallyOption,  @YES]] 
     : @{ NSMigratePersistentStoresAutomaticallyOption :@YES, 
      NSInferMappingModelAutomaticallyOption  :@YES} 
                error:e]; 
} 
相關問題