2013-04-09 183 views
0

我一直在關注Marcus Zarra的指導,以設置我的基於文檔的應用程序。到目前爲止,它一直進展良好,但我試圖實施核心數據輕量級遷移,我似乎遇到了障礙。舊版本和新版本模型之間的唯一區別是其中一個實體的NSString屬性。輕量級遷移

在NSDocument我已經添加以下代碼:

- (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error 
    { 
     NSMutableDictionary *newStoreOptions; 
     if (storeOptions == nil) { 
      newStoreOptions = [NSMutableDictionary dictionary]; 
     } 
     else { 
      newStoreOptions = [storeOptions mutableCopy]; 
     } 
     [newStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption]; 
     [newStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption]; 

     BOOL result = [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newStoreOptions error:error]; 
     NSLog(@"base url:%@ model:%@", [url baseURL], [self managedObjectModel]); 
     return result; 
    } 

只是爲了看看發生了什麼事情我輸出從

[super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newStoreOptions error:error]; 

返回的錯誤變量,這是我從回來Xcode:

NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=512 \"The file couldn\U2019t be saved.\" UserInfo=0x104521930 {NSUnderlyingException=Error validating url for store}"; 
reason = "Can't add destination store"; 

我見過幾篇關於SO的文章,指出一些用戶有這個問題當他們試圖同時讀/寫時,但我不相信我屬於這一類。

此外,我不知道這是否有所作爲,但我設置我的應用程序有兩個上下文。一個是寫入persistentStore的根上下文,第二個是子UI上下文,它是UI發生的所有操作發生的位置。根上下文被設置爲子的父上下文。

謝謝!

更新 愚蠢的我...我想我有一個部分的解決方案,但不知道這將如何在用戶計算機上工作。因此,如果我取消選中「摘要」標籤中的「啓用應用程序沙箱」,一切似乎都有效。雖然這對我有用,但我將其提交給Mac App Store時不得不將其打開,並且不確定這將如何影響用戶。

+0

你要保存什麼URL?在iOS上,您無法保存到主包中。不知道這是如何工作在OS X上,但你可能想看看這個。 –

+0

謝謝斯科特。應用程序正在重新打開一個以前的模型版本保存的舊文件。在啓動過程中,此方法正在執行。所以我沒有保存到捆綁包中(至少......我不認爲我是)。 – schmudu

回答

0

檢查文檔configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error,特別是NSError **參數。你應該通過NSError *的地址,也就是&error(假設你已經定義了NSError *error的地方)。但&error的價值在成功時未定義。使用類似於

if (!result) { 
    NSLog(@"%@", error.localizedFailureReason); 
    // fix it 
}