如何在核心数据中存储图像

Sip*_*oza 72 core-data objective-c ios

我是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];
} 
Run Code Online (Sandbox Code Playgroud)

小智 168

您可以使用二进制数据属性类型将图像存储在Core Data中.但是你应该知道一些事情:

  • 始终将您的UIImage转换为便携式数据格式,如png或jpg例如:

    NSData *imageData = UIImagePNGRepresentation(image);

  • 在此属性上启用"允许外部存储" 描述 如果核心数据达到某个阈值,核心数据会将数据移动到外部文件.此文件也完全由Core Data管理,因此您不必担心它.

  • 如果遇到性能问题,请尝试将二进制数据属性移动到单独的实体.

  • 您应该在NSManagedObject子类的接口后面将转换抽象为NSData,因此您不必担心从UIImage到NSData的转换,反之亦然.

  • 如果您的图像与模型中的实体没有很强的相关性,我建议将它们存储在Core Data之外.

  • 创建一个方法来设置图像 - (void)setImage:(UIImage*)image; 可能在一个类别中.在该方法中,使用UIImagePNGRepresentaion或UIImageJPEG表示,这样您只需要执行一次(您不想保存为PNG并尝试转换为JPEG). (8认同)

Jem*_*igh 12

在xcdatamodelId子类中声明图像实体为NSData...您不能使用UIImage格式,因为图像数据是二进制格式.

@property (nonatomic, retain) NSData *imag;
Run Code Online (Sandbox Code Playgroud)

在Implementation文件中..转换UIImageNSData

UIImage *sampleimage = [UIImage imageNamed:@"sampleImage.jpg"];

NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 0.0);
Run Code Online (Sandbox Code Playgroud)

然后最后保存它

[obj setValue:dataImage forKey:@"imageEntity"]; // obj refers to NSManagedObject
Run Code Online (Sandbox Code Playgroud)


nom*_*nom 5

对于Swift 5Swift 4.2

  1. 转换UIImageData

    let imageData = image.jpegData(compressionQuality: 1.0)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 保存到CoreData

    let object = MyEntity(context: managedContext)   //create object of type MyEntity
    object.image = imageData                         //add image to object
    
    do {
        try managedContext.save()                   //save object to CoreData
    } catch let error as NSError {
        print("\(error), \(error.userInfo)")
    }
    
    Run Code Online (Sandbox Code Playgroud)