2010-01-20 77 views
11

是否可以通過編程方式從Internet上將文件(即sqlite數據庫文件)下載到您的iPhone應用程序中供以後使用?我想用NSURLConnection,但不能保存文件。從url下載文件並保存到iPhone上的資源

這裏是示例代碼我想:

- (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

究竟是什麼在這裏失敗?如果([self.fileData writeToFile:path options:NSAtomicWrite error:nil == NO]){ – Vladimir 2010-01-20 15:08:58

+0

NSLog(@「writeToFile error」); } 我得到「writeToFile錯誤」 – msk 2010-01-20 15:12:01

回答

5

什麼是FILEDATA?它是如何定義和初始化的?

fileData = [NSMutableData data]; 

後應某處:

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

你必須初始化FILEDATA並妥善保存每個內存管理規則。

嘗試用我的答案。有用!

+0

是的,它是在頭文件中定義的方式。 – msk 2010-01-20 15:23:19

+0

我沒有看到它在viewDidLoad上面。它在哪裏初始化? fileData = [NSMutableData data]; – Jordan 2010-01-20 15:24:54

+0

按照我在答案(在viewDidLoad中)的說法初始化fileData,它會起作用。 – Jordan 2010-01-20 15:45:51

4

您需要擴展的路徑與stringByAppendingPathComponent

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

我想從網上下載數據庫(存儲在某個服務器上的某個地方) – msk 2010-01-20 15:22:49

+0

沒關係,你仍然需要擴展〜 – slf 2010-01-20 20:42:17

4

的方法試試這個代碼並執行,

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到文件目錄比較好用這種方式 - > NSURL * documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 你可以這樣[URL路徑]來獲取路徑 – coolcool1994 2016-10-26 23:25:26

0

這可能是對你有用。

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]; 
} 

注意,這是一個writeToFile方法是同步的,所以它會停止/阻止你的用戶界面。

相關問題