2010-01-20 10 views
11

¿Es posible descargar un archivo (es decir, un archivo de base de datos sqlite) desde Internet a la aplicación de iPhone programáticamente para usarlo posteriormente en la aplicación?Descargar un archivo de la url y guardarlo en recursos en el iPhone

Estoy tratando de usar NSURLConnection, pero no puedo guardar el archivo.

Aquí está el código de ejemplo estoy tratando:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSString *file = [NSString stringWithFormat:@"http://en.wikipedia.org/wiki/Text_file"]; 
    NSURL *fileURL = [NSURL URLWithString:file]; 

    NSURLRequest *req = [NSURLRequest requestWithURL:fileURL]; 
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    [self.fileData setLength:0]; 
    self.totalFileSize = [NSNumber numberWithLongLong:[response expectedContentLength]]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
     [self.fileData appendData:data];   
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSArray *dirArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSLog(@"%@", [dirArray objectAtIndex:0]); 

    NSString *path = [NSString stringWithFormat:@"%@/blah.text", [dirArray objectAtIndex:0]]; 

    if ([self.fileData writeToFile:path options:NSAtomicWrite error:nil] == NO) { 
     NSLog(@"writeToFile error"); 
    } 
    else { 
     NSLog(@"Written!"); 
    } 
} 
+0

¿Qué falla exactamente aquí? – Vladimir

+0

if ([self.fileData writeToFile: opciones de ruta de acceso: NSAtomicWrite error: nil] == NO) { NSLog (@ "writeToFile error"); } Aparece "writeToFile error" – msk

Respuesta

5

Lo que es fileData? ¿Cómo se define e inicializa?

fileData = [NSMutableData data]; 

debe haber algún lugar después:

NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self]; 

Usted tiene que inicializar fileData y retenerlo por las normas de gestión de memoria.

Pruébalo con mi respuesta. ¡Funciona!

+0

Sí, se define de esa manera en el archivo de encabezado. – msk

+0

No lo veo en viewDidLoad arriba. ¿Dónde se inicializa? fileData = [datos de NSMutableData]; – Jordan

+0

Inicializa fileData como dije en mi respuesta (en viewDidLoad) y funcionará. – Jordan

4

necesita ampliar la ruta con stringByAppendingPathComponent

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"bookdb.sql"]; 
+0

Quiero descargar la base de datos de Internet (almacenada en algún lugar en algún servidor) – msk

+0

no importa, aún necesita expandir el ~ – slf

4

Prueba este código en un método y ejecutar,

NSURL *url=[NSURL URLWithString:@"http://en.wikipedia.org/wiki"]; 

NSData *dbFile = [[NSData alloc] initWithContentsOfURL:url]; 

NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle] resourcePath] stringByDeletingLastPathComponent]stringByAppendingPathComponent:@"Documents"]]; 

NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"Text_file.txt"]; 

[dbFile writeToFile:filePath atomically:YES]; 
+0

URL al directorio de documentos es mejor así-> NSURL * documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory: NSDocumentDirectory enDomains: NSUserDomainMask] lastObject]; Puede [ruta URL] obtener la ruta – coolcool1994

0

Esto puede ser útil para usted.

NSString *stringURL = @"http://www.somewhere.com/thefile.png"; 
NSURL *url = [NSURL URLWithString:stringURL]; 
NSData *urlData = [NSData dataWithContentsOfURL:url]; 
if (urlData) 
{ 
    NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"filename.png"]; 
    [urlData writeToFile:filePath automically:YES]; 
} 

Tenga en cuenta que este es un método writeToFile es sincrónico, por lo que se detendrá/bloquear la interfaz de usuario.

Cuestiones relacionadas