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
あなたのコードを教えてください。 –
ジョナサンのコードを追加しました。 – glenc
私は同じ問題を抱えています。私は 'NSTemporaryDirectory()'と 'NSCachesDirectory'の両方に対応するディレクトリにnewItemURLが指し示すファイルを作成しようとしましたが、それでもエラーなしで失敗します。あなたは運がありましたか? – Tony