見出し画像

【徒然DB】気ままにUIKit-CoreData編2〜エンティティを継承させた属性のメンテナンス〜

概要

このマガジンは四十を過ぎたおっさんが、

を参考にStoryboardでiOSアプリを完全に趣味で楽しんでいるだけな記事を気ままに上げてます。

今回

をハイ、レッツゴ🕺

前回の記事で、ゆっくりじっくりって言ってたんだけど、
晩飯にカレー食って、ちょっと時間が出来たので、記事をもうひとつ作った〜〜〜

前準備

念の為、

  1. バックアップ

  2. 新規クラスを追加

  3. メニュービューと新規ビューを追加

  4. 今回用の事前準備

をやってから本題へ💃

てな感じかな💦

今回のコード(事前準備)

class AbstractEntityViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var myTextField: UITextField!
    @IBOutlet weak var myLabel: UILabel!
    //管理オブジェクトコンテキスト
    var managedContext:NSManagedObjectContext!
    //最初からあるメソッド
    override func viewDidLoad() {
        super.viewDidLoad()
        do {
            //管理オブジェクトコンテキストを取得する。
            let applicationDelegate = UIApplication.shared.delegate as! AppDelegate
            managedContext = applicationDelegate.persistentContainer.viewContext
            //管理オブジェクトコンテキストからPlayerエンティティを取得する。
            let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Player")
            let result = try managedContext.fetch(fetchRequest) as! [NSManagedObject]
            //すべてのPlayerエンティティの名前をラベルに表示する。
            for data in result {
                myLabel.text = myLabel.text! + ",\n" + String(describing: data.value(forKey:"name")!)
            }
            //デリゲート先に自分を設定する。
            myTextField.delegate = self
        } catch {
            print(error)
        }
    }
    //Returnキー押下時の呼び出しメソッド
    func textFieldShouldReturn(_ textField:UITextField) -> Bool {
        do {
            //ラベルの値にテキストフィールドの値を追記する。
            myLabel.text = myLabel.text! + "," + myTextField.text!
            //新しいPlayerエンティティを管理オブジェクトコンテキストに格納する。
            let player = NSEntityDescription.insertNewObject(forEntityName: "Player", into: managedContext)
            //Playerエンティティの名前にテキストフィールドの値を設定する。
            player.setValue(myTextField.text, forKey:"name")
            //管理オブジェクトコンテキストの中身を永続化する。
            try managedContext.save()
            //キーボードをしまう
            self.view.endEditing(true)
        } catch {
            print(error)
        }
        return true
    }
}

と、見やすいように、データを1つずつ改行しながら見えるようにエスケープ文字\nを入れた〜〜〜

なんかを参考にしてみてね🕺

本題

の設定項目ってことなんだけど、今回は、そんなに項目もないので、ひとつひとつじっくり見てく

Name

エンティティの名前
👉ソースコードからエンティティにアクセスするための識別子になる。

Abstract Entity

チェックを入れると抽象エンティティとなって、他のエンティティで継承できるようになる。

大元のPlayerエンティティを抽象エンティティに〜〜〜
ココにチェックな👀
Add Entityをクリック
ひとつ増えるので〜〜〜
てな感じで〜〜〜親まで設定🕺
てな感じで、Attributeを追加してみて〜〜〜
//
//  ViewController.swift
//
import UIKit
import CoreData
class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var testLabel: UILabel!
    @IBOutlet weak var testTextField: UITextField!
    //管理オブジェクトコンテキスト
    var managedContext:NSManagedObjectContext!
    //最初からあるメソッド
    override func viewDidLoad() {
        super.viewDidLoad()
        do {
            //管理オブジェクトコンテキストを取得する。
            let applicationDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            managedContext = applicationDelegate.managedObjectContext
            //管理オブジェクトコンテキストからPlayerエンティティを取得する。
            let fetchRequest = NSFetchRequest(entityName: "BaseballPlayer")
            let result = try managedContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]
            //すべてのPlayerエンティティの名前をラベルに表示する。
            for data in result {
                testLabel.text = testLabel.text! + "," + String(data.valueForKey("name")!)
            }
            //デリゲート先に自分を設定する。
            testTextField.delegate = self
        } catch {
            print(error)
        }
    }
    //Returnキー押下時の呼び出しメソッド
    func textFieldShouldReturn(textField:UITextField) -> Bool {
        do {
            //ラベルの値にテキストフィールドの値を追記する。
            testLabel.text = testLabel.text! + "," + testTextField.text!
            //新しいPlayerエンティティを管理オブジェクトコンテキストに格納する。
            let player = NSEntityDescription.insertNewObjectForEntityForName("BaseballPlayer", inManagedObjectContext: managedContext)
            //Playerエンティティの名前にテキストフィールドの値を設定する。
            player.setValue(testTextField.text, forKey:"name")
            //管理オブジェクトコンテキストの中身を永続化する。
            try managedContext.save()
            //キーボードをしまう
            self.view.endEditing(true)
        } catch {
            print(error)
        }
        return true
    }
}

を参考に、"Player"👉"BaseballPlayer"に変更するだけ〜〜〜〜

今回のコード(まとめ)

class AbstractEntityViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var myTextField: UITextField!
    @IBOutlet weak var myLabel: UILabel!
    //管理オブジェクトコンテキスト
    var managedContext:NSManagedObjectContext!
    //最初からあるメソッド
    override func viewDidLoad() {
        super.viewDidLoad()
        do {
            //管理オブジェクトコンテキストを取得する。
            let applicationDelegate = UIApplication.shared.delegate as! AppDelegate
            managedContext = applicationDelegate.persistentContainer.viewContext
            //管理オブジェクトコンテキストからPlayerエンティティを取得する。
            let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "BaseballPlayer")
            let result = try managedContext.fetch(fetchRequest) as! [NSManagedObject]
            //すべてのPlayerエンティティの名前をラベルに表示する。
            for data in result {
                myLabel.text = myLabel.text! + ",\n" + String(describing: data.value(forKey:"name")!)
            }
            //デリゲート先に自分を設定する。
            myTextField.delegate = self
        } catch {
            print(error)
        }
    }
    //Returnキー押下時の呼び出しメソッド
    func textFieldShouldReturn(_ textField:UITextField) -> Bool {
        do {
            //ラベルの値にテキストフィールドの値を追記する。
            myLabel.text = myLabel.text! + "," + myTextField.text!
            //新しいPlayerエンティティを管理オブジェクトコンテキストに格納する。
            let player = NSEntityDescription.insertNewObject(forEntityName: "BaseballPlayer", into: managedContext)
            //Playerエンティティの名前にテキストフィールドの値を設定する。
            player.setValue(myTextField.text, forKey:"name")
            //管理オブジェクトコンテキストの中身を永続化する。
            try managedContext.save()
            //キーボードをしまう
            self.view.endEditing(true)
        } catch {
            print(error)
        }
        return true
    }
}
ハイ、問題なし
もう一回田中を入れて、ひとつ前の画面に戻り開き直すと〜〜〜
このとおり🕺

Parent Entity

Entityを継承させる場合に抽象エンティティ名を設定

と、ここの内容は以上。

ブラッシュアップ

いつもどおり、地球儀ボタンだけ追加しとく〜〜〜

てな感じで〜〜〜

記事公開後、

ハイ、完了💃
実機も問題なし🕺

今回の操作で、

エンティティの属性が複数のビューでも使えるってことがわかったね👀

前回、作ったビューでも、今回追加した田中が2つ追加されてる〜〜〜

これが単体ビューごとにプロジェクトを作ってると、
点にしかならないから、
理屈で分かってもイメージができない人が多いんだよね。

Apple公式

さて、次回は

をレッツゴする🕺

この記事が気に入ったらサポートをしてみませんか?