【发布时间】:2013-05-17 03:40:49
【问题描述】:
我是 iOS 新手。我一直在尝试制作一个将从相机捕获的图像存储到CoreData 的应用程序。我现在知道如何存储NSStrings、NSDate 和其他类型的数据,但很难存储图像。看了很多文章说必须先写到磁盘再写到文件,但是我好像看不懂。
以下代码是我用来将其他数据存储到核心数据的代码。
- (IBAction)submitReportButton:(id)sender
{
UrbanRangerAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
managedObjectContext = [appDelegate managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"PotholesDB" inManagedObjectContext:appDelegate.managedObjectContext];
NSManagedObject *newPothole = [[NSManagedObject alloc]initWithEntity:entity insertIntoManagedObjectContext:managedObjectContext];
[newPothole setValue:self.relevantBody.text forKey:@"relevantBody"];
[newPothole setValue:self.subjectReport.text forKey:@"subjectReport"];
[newPothole setValue:self.detailReport.text forKey:@"detailReport"];
// [newPothole setValue:self.imageView forKey:@"photo"];
NSDate *now = [NSDate date];
//NSLog(@"now : %@", now);
NSString *strDate = [[NSString alloc] initWithFormat:@"%@", now];
NSArray *arr = [strDate componentsSeparatedByString:@" "];
NSString *str;
str = [arr objectAtIndex:0];
NSLog(@"now : %@", str);
[newPothole setValue:now forKey:@"photoDate"];
[newPothole setValue:self.latitudeLabel.text forKey:@"latitude"];
[newPothole setValue:self.longitudeLabel.text forKey:@"longitude"];
[newPothole setValue:self.addressLabel.text forKey:@"streetName"];
[newPothole setValue:streeNameLocation forKey:@"location"];
NSError *error;
[managedObjectContext save:&error];
UIAlertView *ll = [[UIAlertView alloc] initWithTitle:@"Saving" message:@"Saved data" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[ll show];
}
【问题讨论】:
-
您的图像可能存储在
UIImage对象中。如果是这样,您可以使用以下命令将其转换为NSData对象:NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(myUIImage)];我相信将NSData对象存储在CoreData中并不难。 -
IMO,通常不建议将二进制数据存储在数据库中。检索比从磁盘读取要慢,并且由于 Core Data 可能会在内部使用 SQLite,因此您将有效地将文件存储在一个文件(SQLite DB)中,导致它的大小非常迅速地扩展并大大减慢了 DB 操作。我只是将路径存储在数据库中,然后将图像保存到磁盘。
-
我同意 dandan78。将图像保存到商店是不明智的。您绝对应该保存图像的路径。
-
可以使用
UIImagePNGRepresentaion或者UIImageJPEGrepresentation获取图片的数据并保存。当您获取数据时,您使用+imageWithData:创建图像。当然,您可以将它们保存到文件中并仅存储文件名。我都做了。给我一分钟,我会寻找一些代码片段。 -
克服它。您可以根据大小将图像存储在 Core Data 中。如果它们的压缩量低于 100k,它们甚至不必在外部文件中。我们发现性能还不错。
标签: ios objective-c core-data