CoreDataと画像(UIImage)
iphoneアプリを試すがてらバリバリ作っているので、CoreDataの話です。
画像をUIImageで取ってきた後、UIImageJPEGRepresentationとかでバイナリにすれば、CoreDataに保存できることは検索すると出てくる。
んで、こっからは自分で試したことなんだけど、UIImageJPEGRepresentationはNSDataなので、UIImage(data: Data)で復元する際に合わない。
でも、どうやら、NSDataとDataは互換性があるみたい。
なので、CoreDataへの保存は
let appDelegate = UIApplication.shared.delegate as! AppDelegate let context = appDelegate.persistentContainer.viewContext let entity = NSEntityDescription.entity(forEntityName: "Book", in: context) self.book = NSManagedObject(entity: entity!, insertInto: context) book!.setValue(UUID().uuidString, forKey: "uuid") book!.setValue(self.textField.text, forKey: "name") book!.setValue(UIImageJPEGRepresentation(self.photoImageView.image!, 1), forKey: "image") do { try context.save() }catch{ fatalError("Managed Object Saving Error.") }
こうで、復元は
let books:[NSManagedObject] = [] ... override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "BookTableViewCell", for: indexPath) as! BookTableViewCell cell.bookLabel.text = self.books[indexPath.row].value(forKey: "name") as? String let imageData = self.books[indexPath.row].value(forKey: "image") as? Data if let data = imageData, let img = UIImage(data: data) { cell.bookimageView.image = img }else{ fatalError("Can't convert to UIImage.") } return cell }
こんな風にDataでキャストして大丈夫みたい。
テンプレート的には、UIImageを取ってくる、UIImage◯◯◯Representationで変換、CoreDataにぶち込む、CoreDataからDataで持ってきて、これをUIImageのdataイニシャライザでUIImageに戻すという感じかな。