2011-02-04 16 views
17

CoreDataベースのアプリケーションの手動トリガ移行プロセスを実装しています。移行が正常に完了した後、移行したDBを元のものの上にreplaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:を使用してください。replaceItemAtURLはiOSではエラーなしで失敗しますが、OSXでは正常に動作します

問題は、iOSでは、このメソッドがYESを返すようにするものは何もありませんが、何が起こっていないかを見るためにエラーポインタに何も置くことはありません。

置き換えを試行する前にすべてのCoreDataオブジェクト(NSMigrationManager、NSManagedObjectModelなど)をシャットダウンしないことを示している箇所(例:http://www.cocoabuilder.com/archive/cocoa/287790-nsdoc-magic-file-watcher-ruins-core-data-migration.html)が原因である可能性があります。 CoreDataのデータに何も関係しないことを検証するために、CoreData DBをまったく必要としない、わずか2つのファイルの作成とスワップを実装しました。

official documentationでは、newitemURLがテンポラリファイルに適しているとみなされていることに気付きました。私はそれがURLForDirectory:inDomain:appropriateForURL:create:error:によって返されたディレクトリを意味していたと仮定して、NSItemReplacementDirectoryを検索パスとして使用しました。

これはどちらでも機能しませんでした。私は、別々の操作を使って置換ロジックを実装することになってしまいましたが、これは非原子的で安全でなく、すべての悪いものです。

iOS上で実行され、replaceItemAtURLへの呼び出しからYESを返すか、実際にはエラー情報をエラーポインタに挿入するコードの作業スニペットを持っている人はいますか?

ご迷惑をおかけして申し訳ございません。

EDIT - 下記に含まれるテストコード。これはメインスレッドの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

あなたのコードを教えてください。 –

+0

ジョナサンのコードを追加しました。 – glenc

+0

私は同じ問題を抱えています。私は 'NSTemporaryDirectory()'と 'NSCachesDirectory'の両方に対応するディレクトリにnewItemURLが指し示すファイルを作成しようとしましたが、それでもエラーなしで失敗します。あなたは運がありましたか? – Tony

答えて

1

私は、iOS上のURLを使用して、すべてのNSFileManager方法で問題を経験しています。ただし、Pathを使用するすべてのメソッドが機能します。だから私はremoveItemAtPath:error:copyItemAtPath:toURL:error:その目的のために使用する必要がありますと思う。

は、大文字と小文字を区別しますが、IOSそれにされていないMACのファイルシステムでは

-1

に役立ちます願っています。同じ名前のファイルが2つありますが、大文字と小文字は区別されますが、パスでは大文字と小文字が区別されます。したがって、fileに.JPEGがあり、あなたのコードで.jpegのリンクを渡している場合、それは失敗します。 あなたとは異なる場合がありますが、何を共有するのか

奇妙なことに間違いはありますが。

関連する問題