2011-02-04 95 views
17

我正在實施基於CoreData的應用程序的手動觸發遷移過程,並且在遷移成功完成後,我試圖將遷移的數據庫移回原來的一個使用replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:頂部。replaceItemAtURL在iOS上無錯誤但在OSX上正常工作

問題是,在iOS上,我沒有做任何事情會使此方法返回YES,但它也不會將任何內容放入錯誤指針以允許您查看發生了什麼問題。

我想讀其他地方的東西(例如http://www.cocoabuilder.com/archive/cocoa/287790-nsdoc-magic-file-watcher-ruins-core-data-migration.html),表明在嘗試替換之前不關閉所有的CoreData對象(例如NSMigrationManager,NSManagedObjectModel等)可能是原因,但事實並非如此。我甚至實現了一個不涉及CoreData DB的小小的兩個文件create-and-swap的事情來驗證CoreData的東西與它沒有任何關係。

然後我在official documentation中注意到newitemURL應該在一個被認爲適用於臨時文件的目錄中。我認爲這意味着使用NSItemReplacementDirectory作爲搜索路徑的URLForDirectory:inDomain:appropriateForURL:create:error:返回的目錄。

那也行不通!我最終回到實施更換邏輯使用單獨的操作,但這是非原子和不安全的,所有這些不好的東西。

有沒有人有在iOS上運行的代碼工作代碼片段,要麼從調用replaceItemAtURL返回YES,要麼將錯誤信息放入錯誤指針?

任何幫助非常感謝。

編輯 - 測試代碼包含在下面。這在主線程上運行application:didFinishLaunchingWithOptions:

NSFileManager *fm = [[NSFileManager alloc] init]; 
NSError *err = nil; 
NSURL *docDir = [NSURL fileURLWithPath:[self applicationDocumentsDirectory]]; 

NSURL *tmpDir = [fm URLForDirectory:NSItemReplacementDirectory 
          inDomain:NSUserDomainMask 
        appropriateForURL:docDir 
          create:NO 
           error:&err]; 

NSURL *u1 = [docDir URLByAppendingPathComponent:@"f1"]; 
NSURL *u2 = [tmpDir URLByAppendingPathComponent:@"f2"]; 
NSURL *repl = nil; 

[fm createFileAtPath:[u1 path] 
      contents:[[NSString stringWithString:@"Hello"] 
         dataUsingEncoding:NSUTF8StringEncoding] 
      attributes:nil]; 

[fm createFileAtPath:[u2 path] 
      contents:[[NSString stringWithString:@"World"]   
         dataUsingEncoding:NSUTF8StringEncoding] 
      attributes:nil]; 

BOOL test = [fm replaceItemAtURL:u1 withItemAtURL:u2 backupItemName:@"f1backup" 
         options:0 resultingItemURL:&repl error:&err]; 

// At this point GDB shows test to be NO but error is still nil 
+0

向我們顯示您的代碼。 – 2011-02-04 15:22:01

回答

1

我在使用iOS上的URL的所有NSFileManager方法遇到問題。但是,所有使用Path工作的方法。所以我認爲你應該使用removeItemAtPath:error:copyItemAtPath:toURL:error:來達到這個目的。

希望它可以幫助

-1

在Mac文件系統不區分大小寫,但在IOS它。即使您不能在一個位置有兩個具有相同名稱但大小寫不同的文件,路徑是區分大小寫的。所以如果文件是.JPEG,並且在你的代碼中你使用.jpeg傳遞鏈接,它將會失敗。 它可能不是你的情況,但只是分享什麼

雖然奇怪,它應該給你錯誤。

相關問題