2011-01-20 5 views
10

Acabo de comenzar con el desarrollo de iPhone. En uno de los ejemplos en los que tuve que mostrar algunos datos almacenados en sqlite db en una vista de tabla en un controlador tabbar, tuve que mover un archivo sqlite del paquete de aplicaciones a la carpeta de documentos.iPhone: ¿Cómo copiar un archivo de los recursos a los documentos?

I utiliza la plantilla de aplicación - Ios> Aplicación> aplicación basada en la ventana para el iPhone (Usado datos básicos para el almacenamiento)

En la plantilla generada por XCode (SDK de base ajustado en último iOS = 4,2), la siguiente código estaba allí ...

- (NSURL *)applicationDocumentsDirectory { 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
} 

al tratar de obtener una ruta a la carpeta de documentos, he utilizado el método dado anteriormente como esto ...

NSString *documentDirectory = [self applicationDocumentsDirectory]; 

esto dio un Warni ng - warning: incompatible Objective-C types initializing 'struct NSURL *', expected 'struct NSString *'

Así que cambió el código siguiente a ...

// Added the message absoluteString over here 
NSString *documentDirectory = [[self applicationDocumentsDirectory] absoluteString]; 

NSString *writableDBPath = [documentDirectory stringByAppendingPathComponent:@"mydb.sqlite"]; 
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"mydb.sqlite"]; 
BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
if (!success) { 
    NSLog(@"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
} 

Y BOOM !!! Dio el error que - 'Failed to create writable database file with message 'The operation couldn’t be completed. No such file or directory'.'

¿Cómo puedo encontrar la ruta al directorio de documentos ya que el método applicationDocumentsDirectory generado por la plantilla XCode no funciona para mí.

Además, ¿alguien puede arrojar algo de luz sobre el propósito del método applicationDocumentsDirectory dado anteriormente?

Gracias

+0

que estaba recibiendo de error porque no estaba añadiendo el nombre del archivo en el writableDBPath. Este ejemplo me ayudó a solucionarlo. ¡Gracias! +1 – voghDev

Respuesta

5

Acabo de toparme con esto hace unos días. No fuerces las cosas por el camino de Path, abraza el camino de NSURL. No tomará sino un corto tiempo obtener cómo usarlos.

En cuanto al método, simplemente le pide al sistema que le proporcione una URL al directorio de documentos estandarizados para la aplicación. Use esto y todo lo relacionado con dónde colocar nuevos archivos será correcto.

+0

más detalles sobre esto por favor? :( –

20

heres una forma sencilla de hacerlo:

NSFileManager *fmngr = [[NSFileManager alloc] init]; 
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"mydb.sqlite" ofType:nil]; 
    NSError *error; 
    if(![fmngr copyItemAtPath:filePath toPath:[NSString stringWithFormat:@"%@/Documents/mydb.sqlite", NSHomeDirectory()] error:&error]) { 
     // handle the error 
     NSLog(@"Error creating the database: %@", [error description]); 

    } 
    [fmngr release]; 
+2

Rico, tiene razón, pero está un poco desactualizado De los documentos actuales: "Esto siempre devolverá la misma instancia del administrador de archivos. El objeto devuelto no es seguro para subprocesos. En Mac OS X v 10.5 y más adelante debería considerar usar [[NSFileManager alloc] init] en lugar del método singleton defaultManager. Usando [[NSFileManager alloc] init], la instancia resultante de NSFileManager es segura para hilos. " –

+0

Entonces, haría un par de pequeños cambios a lo anterior: cambiaría el RHS de la primera línea a [[NSFileManager alloc] init], y agregaría [fmngr release]; después del bloque if. –

+0

Gracias por señalarlo. Ahora recuerdo haber leído eso cuando 4.0 salió, pero creo que simplemente lo llevé a la parte posterior de mi cabeza aprendiendo sobre todas las demás actualizaciones. – Rich

Cuestiones relacionadas