我练习如何解析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'
答案 0 :(得分:0)
有几点想法:
与您手头的问题无关,而不是stringByAppendingString
,通常最好将URLByAppendingPathComponent
与NSURL一起使用。它会为您添加任何必要的/
字符。鉴于你的例子并不重要,但它更强大。
此外,如果字符串可能包含空格或URL中不允许的其他字符,那么您也可以将其转义为百分比。
因此,您可以执行以下操作:
NSURL *fixedURL = [NSURL URLWithString:@"http://services.hanselandpetal.com/photos/"];
NSURL *url = [fixedURL URLByAppendingPathComponent:[photo stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
您应该NSLog
NSURL
变量,并确保它不是nil
(例如,如果{{1}中有一些空格可能会导致例如,字符串,除非你百分比转义它。)
在您修改的问题中,您共享日志,原始网址字符串(转换为photo
之前)报告为:
http:/services.hanselandpetal.com/photos/mona_lavender.jpg
应该是:
http://services.hanselandpetal.com/photos/mona_lavender.jpg
如果NSURL
不是imgURL
,但是nil
,则可能需要以检索错误的方式检索图像数据。例如,您可以:
imageData
最重要的是,一次检查这一行并准确识别出错的地方。
顺便说一下,您通常希望避免使用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]