来自sqlite的图像路径无法正常工作

时间:2014-10-14 16:00:11

标签: ios sqlite

我练习如何解析XML数据并将其存储到sqlite中。我已成功解析和存储。但我有一个问题,从网址显示图像。 URL由两个NSStrings组合而成。一个用于固定地址(我设置值),另一个用于基于照片名称(从Sqlite检索)。我可以通过从Sqlite中检索照片的名称来创建完整的URL。但是当我使用该URL在UIImageView中显示图像时,会发生奇怪的事情。这是行不通的。经过一些测试,我发现从Sqlite中检索到的部分(照片名称)有问题。如果我将固定地址与照片的文字名称相结合,则可以正常工作。有人可以解释为什么会这样。提前谢谢。

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"user.db"];
FMDatabase * database = [FMDatabase databaseWithPath:defaultDBPath];
[database open];



results=[database executeQuery:@"SELECT * FROM plant WHERE name=?",self.plantname];
while([results next]) {

    name = [results stringForColumn:@"name"];
    category = [results stringForColumn:@"category"];
    instructions = [results stringForColumn:@"instructions"];
    price = [results stringForColumn:@"price"];
    photo=[results stringForColumn:@"photo"];
}

NSString * fixedURL = @"http://services.hanselandpetal.com/photos/";
NSString *url=[fixedURL stringByAppendingString:photo];
NSLog(url);


NSURL * imgURL = [NSURL URLWithString:url];
NSData * imageData = [NSData dataWithContentsOfURL:imgURL];
UIImage * image = [UIImage imageWithData:imageData];

self.plantImageView.image=image;

修改

我根据Rob的回答进行了编辑。但仍有问题。我把日志放在下面。我已经尝试使用[photo stringByReplacingOccurrencesOfString:@"删除空格。 " withString:@"&#34]。但它似乎没有影响。

2014-10-15 02:12:39.505 SqlitePractice[9256:286525] url string = 'http:/services.hanselandpetal.com/photos/mona_lavender.jpg'
2014-10-15 02:12:39.506 SqlitePractice[9256:286525] imgURL = (null)
2014-10-15 02:12:39.516 SqlitePractice[9256:286525] sendAsynchronousRequest failed: Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" UserInfo=0x7a78ba50 {NSUnderlyingError=0x7a66b5e0 "unsupported URL", NSLocalizedDescription=unsupported URL}   

修改2

从stringByAppendingString更改为stringByAppendingPathComponent后,URL似乎有问题。但是我发现即使在http:之后没有一个斜线,如果我改变了照片值,它也能工作。并显示图像。

NSString * fixedURL = @"http://services.hanselandpetal.com/photos/";
photo=@"bougainvillea.jpg";
NSString *url=[fixedURL stringByAppendingPathComponent:photo];
NSLog(@"url string = '%@'", url);
NSURL * imgURL = [NSURL URLWithString:url];
NSLog(@"imgURL = %@", imgURL);

日志在下面,

2014-10-15 12:07:56.650 SqlitePractice[9690:308022] url string = 'http:/services.hanselandpetal.com/photos/bougainvillea.jpg'
2014-10-15 12:07:56.651 SqlitePractice[9690:308022] imgURL = http:/services.hanselandpetal.com/photos/bougainvillea.jpg

编辑3 我已根据Rob的修改后的答案进行了更改。

NSURL *fixedURL = [NSURL URLWithString:@"http://services.hanselandpetal.com/photos/"];
NSURL *url = [fixedURL URLByAppendingPathComponent:[photo stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
 NSLog(@"image URL = '%@'", url);


NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    if (error) {
        NSLog(@"sendAsynchronousRequest failed: %@", error);
        return;
    }
    UIImage *image = [UIImage imageWithData:data];
    self.plantImageView.image=image;
}];

这是日志消息:

2014-10-15 13:40:38.977 SqlitePractice[10436:357359] image URL = 'http://services.hanselandpetal.com/photos/camellia.jpg%250A%2520%2520%2520%2520'

2 个答案:

答案 0 :(得分:0)

有几点想法:

  1. 与您手头的问题无关,而不是stringByAppendingString,通常最好将URLByAppendingPathComponent与NSURL一起使用。它会为您添加任何必要的/字符。鉴于你的例子并不重要,但它更强大。

    此外,如果字符串可能包含空格或URL中不允许的其他字符,那么您也可以将其转义为百分比。

    因此,您可以执行以下操作:

    NSURL *fixedURL = [NSURL URLWithString:@"http://services.hanselandpetal.com/photos/"];
    NSURL *url = [fixedURL URLByAppendingPathComponent:[photo stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    
  2. 您应该NSLog NSURL变量,并确保它不是nil(例如,如果{{1}中有一些空格可能会导致例如,字符串,除非你百分比转义它。)

    在您修改的问题中,您共享日志,原始网址字符串(转换为photo之前)报告为:

    http:/services.hanselandpetal.com/photos/mona_lavender.jpg
    

    应该是:

    http://services.hanselandpetal.com/photos/mona_lavender.jpg
    
  3. 如果NSURL不是imgURL,但是nil,则可能需要以检索错误的方式检索图像数据。例如,您可以:

    imageData
  4. 最重要的是,一次检查这一行并准确识别出错的地方。


    顺便说一下,您通常希望避免使用NSError *error = nil; NSData *imageData = [NSData dataWithContentsOfURL:imgURL options:0 error:&error]; if (!imageData) { NSLog(@"dataWithContentsOfURL failed: %@", error); } ,而是使用异步方法:

    dataWithContentsOfURL

答案 1 :(得分:0)

我相信UIIMAGEVIEW不会将Url显示为图像路径。我会尝试用UIWebView来显示网页内容(图片或整个网页)。这个例子是在objective-c。

中写的
self.myWebView = [[UIWebView alloc] initWithFrame:self.view.bounds];
self.myWebView.scalesPageToFit = YES ; 
[self.view addSubview:self.myWebView];

NSURL *url = [NSURL URLWithString:@"http://services.hanselandpetal.com/photos/mona_lavender.jpg"]; 
NSURLRequest *request = [ NSURLRequest requestWithURL:url]; 
[self.myWebView loadRequest:request]