質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

1008閲覧

[swift] Core Dataによる画像の保存

Kaguya_4869

総合スコア116

Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/02/24 11:52

#質問したいこと
いつもお世話になっております。
現在写真付きのTodoリストを作成中です。
core dataを使って画像を保存してみようと思っているのですが、
保存できなくて困っています。
#コード

swift

1//一番最初の画面 2import UIKit 3import CoreData 4 5class noteTableViewController: UITableViewController { 6 7 var notes = [Note]() 8 9 var managedObjectContext: NSManagedObjectContext? { 10 return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 11 } 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 // styles 17 self.tableView.backgroundColor = UIColor(red: 242.0/255.0, green: 242.0/255.0, blue: 242.0/255.0, alpha: 1.0) 18 } 19 20 override func viewDidAppear(_ animated: Bool) { 21 super.viewDidAppear(true) 22 23 retrieveNotes() 24 } 25 // MARK: - Table view data source 26 27 override func numberOfSections(in tableView: UITableView) -> Int { 28 return notes.count 29 } 30 31 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 32 return 0 33 } 34 35 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 36 let cell = tableView.dequeueReusableCell(withIdentifier: "noteTableCell", for: indexPath) as! noteTableViewCell 37 38 let note: Note = notes[indexPath.row] 39// cell.configureCell(note: note) 40 cell.configureCell(note: note) 41 cell.backgroundColor = UIColor.clear 42 43 return cell 44 } 45 46 override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 47 48 return true 49 } 50 51 override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 52 if editingStyle == .delete{ 53 tableView.deleteRows(at: [indexPath], with: .fade) 54 } 55 56 tableView.reloadData() 57 } 58 59 func retrieveNotes() { 60 managedObjectContext?.perform { 61 62 self.fetchNotesFromData { (notes) in 63 if let notes = notes { 64 self.notes = notes 65 self.tableView.reloadData() 66 } 67 } 68 } 69 } 70 71 func fetchNotesFromData(completion: @escaping ([Note]?) -> Void) { 72 managedObjectContext?.perform { 73 var notes = [Note]() 74 let request: NSFetchRequest<Note> = Note.fetchRequest() 75 76 do { 77 notes = try self.managedObjectContext!.fetch(request) 78 completion(notes) 79 } catch { 80 print("Could not fetch notes from CoreData:(error.localizedDescription)") 81 } 82 } 83 } 84} 85

swift

1//追加画面 2import UIKit 3import CoreData 4 5 6class ViewController: UIViewController, UITextFieldDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextViewDelegate { 7 8 @IBOutlet weak var noteInfoView: UIView! 9 @IBOutlet weak var noteImageViewsView: UIView! 10 11 @IBOutlet weak var noteTextField: UITextField! 12 @IBOutlet weak var noteDescriptionLabel: UITextView! 13 14 @IBOutlet weak var noteImageView: UIImageView! 15 16 17 var managedObjectContext: NSManagedObjectContext? { 18 return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 19 } 20 21 var notesFetchedResultConroller: NSFetchedResultsController<Note>! 22 var notes = [Note]() 23 var note: Note? 24 var isExiting = false 25 var indexPath: Int? 26 27 override func viewDidLoad() { 28 super.viewDidLoad() 29 noteImageView.image = UIImage(contentsOfFile: "No-Image.PNG") 30 31 if let note = note { 32 noteTextField.text = note.noteName 33 noteDescriptionLabel.text = note.noteDescription 34 noteImageView.image = UIImage(data: note.noteImage! as Data) 35 } 36 if noteTextField.text != "" { 37 isExiting = true 38 } 39 40 //delegates 41 noteTextField.delegate = self 42 noteDescriptionLabel.delegate = self 43 44 45 noteTextField.setButtomBorder() 46 47 } 48 49 //core data 50 51 func saveToCoreData(completion: @escaping ()-> Void) { 52 53 managedObjectContext!.perform { 54 do { 55 try self.managedObjectContext?.save() 56 completion() 57 print("No saved to Core Data") 58 } 59 catch let error { 60 print("Could not save note to Coredata") 61 } 62 } 63 } 64 65 //Camera 66 //カメラロールから写真を選択する処理 67 @IBAction func choosePicture() { 68 // カメラロールが利用可能か? 69 if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { 70 // 写真を選ぶビュー 71 let pickerView = UIImagePickerController() 72 // 写真の選択元をカメラロールにする 73 // 「.camera」にすればカメラを起動できる 74 pickerView.sourceType = .photoLibrary 75 // デリゲート 76 pickerView.delegate = self 77 // ビューに表示 78 self.present(pickerView, animated: true) 79 } 80 } 81 82 @IBAction func takePicture() { 83 let camera = UIImagePickerController.SourceType.camera 84 if UIImagePickerController.isSourceTypeAvailable(camera) { 85 let picker = UIImagePickerController() 86 picker.sourceType = camera 87 picker.delegate = self 88 self.present(picker, animated: true) 89 } 90 } 91 92 //Save 93 @IBAction func saveButtonWasPressed(_ sender: UIBarButtonItem) { 94 95 if noteTextField.text == "Description..." { 96 97 let alertController = UIAlertController(title: "Missing Information", message: "You left one or more fields empty. Please make sure that all fields are filled before attempting to save/", preferredStyle: UIAlertController.Style.alert) 98 let OKAction = UIAlertAction(title: "Dismiss", style: UIAlertAction.Style.default, handler: nil) 99 100 alertController.addAction(OKAction) 101 102 self.present(alertController, animated: true, completion: nil) 103 } 104 else { 105 if (isExiting == false) { 106 let noteName = noteTextField.text 107 let noteDescription = noteDescriptionLabel.text 108 109 if let moc = managedObjectContext{ 110 let note = Note(context: moc) 111 112 113 note.noteName = noteName 114 note.noteDescription = noteDescription 115 116 saveToCoreData() { 117 let isPressingInAddNoteMode = self.presentingViewController is UINavigationController 118 119 if isPressingInAddNoteMode { 120 self.dismiss(animated: true, completion: nil) 121 } 122 else { 123 self.navigationController!.popViewController(animated: true) 124 } 125 } 126 127 128 } 129 } 130 else if (isExiting == true) { 131 let note = self.note 132 133 let managedObject = note 134 managedObject!.setValue(noteTextField.text, forKey: "noteName") 135 managedObject!.setValue(noteDescriptionLabel.text, forKey: "noteDescription") 136 137 if let data = self.noteImageView.image!.jpegData(compressionQuality: 1.0){ 138 managedObject!.setValue(data, forKey: "noteImage") 139 } 140 do { 141// try context.save() 142 143 let isPressingInAddNoteMode = self.presentingViewController is UINavigationController 144 145 if isPressingInAddNoteMode { 146 147 self.dismiss(animated: true, completion: nil) 148 } 149 else{ 150 self.navigationController!.popViewController(animated: true) 151 } 152 153 } 154 155 catch{ 156 print("Failed to update exisiting note.") 157 } 158 } 159 160 } 161 } 162 163 164 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 165 textField.resignFirstResponder() 166 167 return false 168 } 169 170 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { 171 if(text == "\n") { 172 textView.resignFirstResponder() 173 174 return false 175 } 176 return false 177 } 178 179 func textViewDidBeginEditing(_ textView: UITextView) { 180 if (textView.text == "Description...") { 181 textView.text = "" 182 } 183 } 184 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 185 if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { 186 self.noteImageView.image = image 187 } 188 self.dismiss(animated: true) 189 } 190 191 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 192 picker.dismiss(animated: true, completion: nil) 193 } 194} 195 196 197 198

追加画面でSaveボタンを押しても、アラートも表示されず、そのまま前の画面に戻ってしまい、Cellにも何も追加されていない状態です。

どうすれば保存できるか教えてもらいたいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/02/25 06:51

Core Data に限らず、データベースに画像を保存するのはあまりお勧めされてません。画像は別途ファイルとして保存するのが一般的です。
MasakiHori

2020/02/25 09:43

CoreDataの場合プロパティをAllows External Storageにすることで大きなデータは自動的に別ファイルに分離されます。ユーザはそれを意識する必要はありません。 また、きちんと設計すれば必要なときにのみ画像をロードするようにも出来ます。 ですので、その辺をきちんと押さえておけば画像の保存に利用しても問題ありません。 ただし、よく知られているようにデータ数が膨大な場合CoreDataは遅いです。(量ではなく数) これはどうしようもできません。
Kaguya_4869

2020/02/25 13:11

ご回答ありがとうございます。 プロパティをAllows External Storageにするにはどうすればいいですか? ご教授よろしくお願いいたします。
MasakiHori

2020/02/26 00:25

ふつうにググれば見つかりますが? 画像検索すればXcode上での設定画面も。 あと訂正です。CoreDataエンティティの場合プロパティではなくAttributeが正しいです。
Kaguya_4869

2020/02/26 09:21

ありがとうございます。 調べてみて、Allows External Storageにチェックを入れてみたのですが、状況は変わりませんでした。 何か他に原因があるということでしょうか? ご教授よろしくお願いいいたします。
MasakiHori

2020/02/26 09:44

Allows External Storageと質問は関係がありません。 hoshi-takanori様がCoreDataが画像保存に向いていない旨をコメントしておりましたのでその反論としてコメントしております。 質問に対する回答ですが、僕なら全部書き直すレベルのものであり、さすがにそこまでの労力はかけられませんので、控えさせていただきます。
Kaguya_4869

2020/02/26 13:29

そうでしたか。 ご協力いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問