Swift 4 İle Core Data Kullanımı

Core Data telefonumuzda kullandığımız uygulama ile ilgili büyük çaplı verilerin depolanması için kullanmış olduğumuz Xcode ile birlikte gelen bir veritabanıdır. Telefonumuzda kullandığımız uygulamayı sildiğimiz zaman otomatik bir şekilde tutulan verilerde silinir. Konunu daha iyi anlaşılması için basit bir program yaparak anlamaya çalışalım. Uygulamamızda filmlerin resimleri, isimleri, tarihleri ve imdb puanlarının tutulduğu bir liste yapmaya çalışacağız.
Öncelikle Create a new Xcode project >> Single View App diyoruz ve projemizin ismini yazıp Use Core Data seçeneğini seçip projemizi oluşturuyoruz.
Projemizi oluşturduktan sonra veritabanımızı şemasını oluşturmamız gerekiyor. projenin_adı.xcdatamodeld adlı klasörümüzü açıp aşağıdaki resimde olacak şekilde ayarlamalarımızı yapıyoruz.
Veritabanı modelimizi oluşturduğumuza göre Info.plist dosyamıza gelip sağ tıklayıp Add Row diyerek “Privacy – Photo Library Usage Description” fotoğraf galerisine ulaşma iznini ekliyoruz.
Artık uygulamamızı nasıl yapacağımıza gelelim Main.storyboard dosyasını açıp aşağıdaki gibi dizayn ediyoruz.
Film resmini, adını, tarihini, imdb puanını kayıt etmek için oluşturduğumuz filmEkleVC.swift dosyası üzerinde gerçekleştireceğiz.
filmEkleVC.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
// // flimEkleVC.swift // flimListesi // // Created by Esat Gözcü on 28.11.2017. // Copyright © 2017 Esat Gözcü. All rights reserved. // import UIKit import CoreData class filmEkleVC: UIViewController , UIImagePickerControllerDelegate, UINavigationControllerDelegate { @IBOutlet weak var puanText: UITextField! @IBOutlet weak var yilText: UITextField! @IBOutlet weak var isimText: UITextField! @IBOutlet weak var resimView: UIImageView! var gösterilecekFilmAdi = "" var gösterilecekFilmYili = Int() var gösterilecekFilmPuani = Double() var gösterilecekFilmResimi = UIImage() override func viewDidLoad() { super.viewDidLoad() //Önceki sayfada bir flim seçilirse değerleri aktarıyoruz isimText.text = gösterilecekFilmAdi puanText.text = String(gösterilecekFilmPuani) yilText.text = String(gösterilecekFilmYili) resimView.image = gösterilecekFilmResimi //Tıklanabilirliği aktif hale getiriyoruz resimView.isUserInteractionEnabled = true let recognizer = UITapGestureRecognizer(target: self, action: #selector(filmEkleVC.choosePhoto)) resimView.addGestureRecognizer(recognizer) } @objc func choosePhoto() { let picker = UIImagePickerController() picker.delegate = self //Kamerayıda seçebiliriz picker.sourceType = .camera //Resim galerisine gidiyoruz picker.sourceType = .photoLibrary //Fotoğrafı düzenlemeyi aktif hale getiriyoruz picker.allowsEditing = true present(picker,animated: true,completion: nil) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { //Resimi seçtikten sonra.. resimView.image = info[UIImagePickerControllerEditedImage] as? UIImage self.dismiss(animated: true, completion: nil) } @IBAction func ekleButton(_ sender: Any) { //Core Dataya verileri ekliyoruz let appDelegate = UIApplication.shared.delegate as! AppDelegate //Appdelegate'deki core data için oluşturulan fonksiyona erişiyoruz let context = appDelegate.persistentContainer.viewContext let newMovie = NSEntityDescription.insertNewObject(forEntityName: "Movie", into: context) newMovie.setValue(isimText.text!, forKey: "name") if let year = Int(yilText.text!) { newMovie.setValue(year, forKey: "year") } if let puan = Double(puanText.text!) { newMovie.setValue(puan, forKey: "imdb") } let data = UIImageJPEGRepresentation(resimView.image!, 0.5) newMovie.setValue(data, forKey: "image") do { //Context'i kayıt ediyoruz try context.save() print("succesful") } catch{ //Hata olduğu error yazdırıyoruz print("error") } //Diğer sayfaya geçiş yapıyoruz self.navigationController?.popViewController(animated: true) } } |
Eklediğimiz filmlerin isimlerini ViewController.swift adlı dosyamızda eklediğimiz tableView içerisine aktarıyoruz.
ViewController.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
// // ViewController.swift // flimListesi // // Created by Esat Gözcü on 28.11.2017. // Copyright © 2017 Esat Gözcü. All rights reserved. // import UIKit import CoreData class ViewController: UIViewController , UITableViewDataSource, UITableViewDelegate{ @IBOutlet weak var tableView: UITableView! //Film bilgileri için Arraylar oluşturuyoruz var isimArray=[String]() var yilArray = [Int]() var puanArray=[Double]() var resimArray = [Data]() //Diğer sayfaya Film bilgilerini diğer sayfaya göndermek için değişken oluşturuyoruz var secilenFilmAdi = "" var secilenFilmYili = Int() var secilenFilmPuani = Double() var secilenFilmResimi = UIImage() override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self isimlerigetir() } override func viewWillAppear(_ animated: Bool) { //ViewControlller her çalıştığında harekete geçer isimlerigetir() //Böylelikle flim eklendiği zaman tekrardan tableView'deki veriler güncellenir } func isimlerigetir(){ //İsimArray'in içini boşaltıyoruz isimArray.removeAll(keepingCapacity: false) yilArray.removeAll(keepingCapacity: false) puanArray.removeAll(keepingCapacity: false) resimArray.removeAll(keepingCapacity: false) //Core Datadan verileri çekiyoruz //AppDelegate'deki fonskiyona erişiyoruz let appDelegate = UIApplication.shared.delegate as! AppDelegate let context = appDelegate.persistentContainer.viewContext //Verileri "Movie" entities'ten çekiyoruz let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Movie") fetchRequest.returnsObjectsAsFaults=false do{ let results = try context.fetch(fetchRequest) if results.count > 0 { for result in results as! [NSManagedObject] { if let isim = result.value(forKey: "name") as? String { //Elde ettiğimiz isimleri isimArray'e aktarıyoruz self.isimArray.append(isim) } self.tableView.reloadData() if let yil = result.value(forKey: "year") as? Int { //Elde ettiğimiz yılı yilArray'e aktarıyoruz self.yilArray.append(yil) } if let puan = result.value(forKey: "imdb") as? Double { //Elde ettiğimiz puanları puanArray'e aktarıyoruz self.puanArray.append(puan) } if let resim = result.value(forKey: "image") as? Data { //Elde ettiğimiz resimleri resimArray'e aktarıyoruz self.resimArray.append(resim) } self.tableView.reloadData() } } } catch{ print("Error") } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { //İsimArray'deki eleman sayısını belirtiyoruz return isimArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableViewCell() //isimArray'deki verileri TableView'e aktarıyoruz cell.textLabel?.text=isimArray[indexPath.row] return cell } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { //Eğer listeden bir filme veya ekle butonuna basılırsa if segue.identifier == "segue" { //filmEkleVC'deki değişkenlerin değerlerini değiştiriyoruz let destinationVC = segue.destination as! filmEkleVC destinationVC.gösterilecekFilmAdi = secilenFilmAdi destinationVC.gösterilecekFilmYili = secilenFilmYili destinationVC.gösterilecekFilmPuani = secilenFilmPuani destinationVC.gösterilecekFilmResimi = secilenFilmResimi } } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { //TableView'de bir flim seçtiğimizde çalışacak //Değişkenlere bilgileri aktarıyoruz secilenFilmAdi = isimArray[indexPath.row] secilenFilmYili = yilArray[indexPath.row] secilenFilmPuani = puanArray[indexPath.row] secilenFilmResimi = UIImage(data: resimArray[indexPath.row])! performSegue(withIdentifier: "segue", sender: nil) } @IBAction func ekleButton(_ sender: Any) { secilenFilmAdi = "" secilenFilmYili = Int() secilenFilmPuani = Double() secilenFilmResimi = UIImage(named: "resimekle.png")! //Diğer sayfaya geçiş yapıyoruz performSegue(withIdentifier: "segue", sender: nil) } } |
Böylelikle Core Data kullanarak nasıl uygulama geliştirebileceğimiz görmüş olduk. Projenin kodlarını buraya tıklayarak indirebilirsiniz.