2011-05-16 111 views
4

ALM很棒。但我無法讓它在使用Core Data和NSDocument的項目上工作。看來ALM默認是禁用的。在NSPersistentDocument上啓用核心數據的自動輕量遷移

好。對於任何一個正常的項目,你會添加兩個相應的選項,字典中的這一行:

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) 

...但使用帶有NSD CD時,該行不存在(NSPersistentDocument隱藏的細節,我可以看不出你如何修改它們)。

下面的方法似乎提供了希望:

configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error: 

...有些人在郵件列表(由4+年前)的報告成功覆蓋該方法,改變選擇字典,然後再調用它在「超級」。可悲的是,這並不適合我。我想提醒想,首先,如果你有類似的問題 - 再回來,如果它仍然無法正常工作:)

回答

7

製作一個從無到有的新包芯數據與-NSDocument的項目,我想,沒有原來的工作方式,並且它工作得很好此時:

-(BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error 
{ 
    NSMutableDictionary *newOptions = [NSMutableDictionary dictionaryWithDictionary:storeOptions]; 
    [newOptions setValue:@"YES" forKey:NSMigratePersistentStoresAutomaticallyOption]; 
    [newOptions setValue:@"TRUE" forKey:NSInferMappingModelAutomaticallyOption]; 

    return [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newOptions error:error]; 
} 
1

注:我懷疑我的問題的根本原因是Xcode4是正確更新私人散列它使用而不是版本號來跟蹤數據模型版本。也許我不小心添加了一些東西,然後刪除它,並且它改變了哈希值 - 我的原始模型非常簡單,很容易通過目測進行比較,並且沒有差異。

此外,更廣泛的問題是,Xcode4 仍然不處理CoreData項目正常 - 它創建CoreData模型作爲「版本」在默認情況下(從Xcode3大的改善,這是註定要始終創建沒用型號) ,但它仍然不會任何處理模型中的更改 - 您必須手動記住在保存任何更改之前更新版本(否則所有項目遷移將永遠失敗,永遠無法離開)。

此外,一旦出現問題,我找不到任何「正確的」解決方案 - 蘋果的Core Data lib中缺少太多的部分。基本上:據我所知,NSPersistentDocument是不完整的,不受支持的。


最後,我去下面殘酷的解決方法:指導大家用舊版本手動編輯CoreData商店聲稱他們正在運行當前版本。

這項工作100%,因爲與CoreData不同,我的應用程序被編寫爲智能地更正任何明顯缺少的導入數據。這是微不足道的,但CoreData不允許你說「是的,我已經完成了,沒關係,繼續打開文件!」

  1. 在舊版本:「保存爲XML」
  2. 給了他們新的頭複製/粘貼到文件的頂部。注意:蘋果公司使用哈希代替版本號,這使得這看起來很可怕,即使它不是。我不明白爲什麼蘋果會忽略他們自己的版本系統並使用哈希代替?在新版本中
  3. :打開更新的文件
  4. 在新的版本: 「保存」

...並且因爲我重寫NSManagedObject方法:

-awakeFromInsert

和固定任何不正確的/缺失的數據時,步驟3和4上面的「自動的」更新數據。

我知道「正確」的方式本來就是創建一個映射模型,但是對於大多數情況來說它是巨大的矯枉過正......而蘋果拒絕首先加載舊數據。所以,核心數據只是拒絕甚至允許我糾正數據 - 即使我的代碼很高興地這樣做。

(所有舊的項目有進口和正確導出 - 沒有問題)

恕我直言:CoreData真的需要蘋果的結束一些重新設計,以解決所有的邊緣情況下,他們沒有想到第一次就。


注:快速警告:確保你不改變裏面任何awakeFromFetch變量CoreData - 蘋果暫時禁用更改跟蹤調用該方法之前(這是一種可笑的 - 它與行爲不兼容的方法所有其他「awakeFrom *」方法)。

蘋果的建議是:內awakeFromFetch,決定你要去改變什麼,然後封裝和使用這樣的:

[自performSelector:@選擇(myAwakeFromFetchFixItemX :) withObject:X afterDelay:0.01] ;

...只是想我會補充說,任何人嘗試這種 - 否則你的進口將工作正常,但你的出口將默默無法包括固定的數據!