2011-02-04 10 views
17

Estoy implementando un proceso de migración desencadenado manualmente para una aplicación basada en CoreData, y después de que la migración se complete con éxito, intento mover la base de datos migrada nuevamente por el la parte superior de la original usando replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:.replaceItemAtURL falla sin error en iOS pero funciona bien en OSX

El problema es que en iOS, nada de lo que haga hará que este método devuelva SÍ, sin embargo, nunca pone nada en el puntero de error para permitirte ver lo que está pasando mal.

He leído cosas en otros lugares (por ejemplo, http://www.cocoabuilder.com/archive/cocoa/287790-nsdoc-magic-file-watcher-ruins-core-data-migration.html) indicando que no detener todos los objetos CoreData (por ejemplo, NSMigrationManager, NSManagedObjectModel, etc.) antes de intentar reemplazar podría ser la causa, pero eso no fue así. Incluso implementé una pequeña creación de dos archivos y cosas que no involucraban CoreData DB para verificar que las cosas de CoreData no tuvieran nada que ver con eso.

Noté entonces en el official documentation que se supone que el newitemURL está en un directorio que se considera apropiado para los archivos temporales. Supuse que eso significaba un directorio devuelto por URLForDirectory:inDomain:appropriateForURL:create:error: usando NSItemReplacementDirectory como la ruta de búsqueda.

¡Eso tampoco funcionó! Terminé recurriendo a la implementación de la lógica de reemplazo usando operaciones separadas, pero esto no es atómico, no es seguro y todo eso es malo.

¿Alguien tiene un fragmento de código de trabajo que se ejecuta en iOS que o bien devuelve SÍ desde una llamada al replaceItemAtURL o realmente coloca información de error en el puntero de error?

Cualquier ayuda muy apreciada.

EDITAR - Código de prueba incluido a continuación. Esto se ejecuta en application:didFinishLaunchingWithOptions: en el hilo principal.

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

Muéstranos tu código. –

+0

Han agregado el código anterior a Jonathan: se agradece cualquier entrada. – glenc

+0

Me encuentro con el mismo problema. He intentado colocar el archivo de creación señalado por newItemURL en los directorios correspondientes a 'NSTemporaryDirectory()' y 'NSCachesDirectory', y aún falla sin ningún error. ¿Tuviste un poco de suerte? – Tony

Respuesta

1

he experimentado problemas con todos los métodos NSFileManager usando una URL en IOS. Sin embargo, todos los métodos que usan Path funcionan. Así que creo que debería usar removeItemAtPath:error: y copyItemAtPath:toURL:error: para tal fin.

creo que sirve

-1

En el sistema de archivos Mac no distingue entre mayúsculas y minúsculas, pero en iOS ella. Aunque no puede tener dos archivos con el mismo nombre pero con diferentes casos en una ubicación, la ruta distingue entre mayúsculas y minúsculas. Entonces, si el archivo tiene .JPEG y en su código está pasando el enlace con .jpeg, fallará. Puede que no sea el caso con usted, pero solo qué compartir

Aunque extrañamente debería darle un error.

Cuestiones relacionadas