m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

swiftの学習(coredataを使用)

ちょっとわかりにくいとつい後回しになる癖がある

わかることからやるのはいいけど取り組むのはなるべく早くしたほうがいいと思う

準備

プロジェクト作成時にcoredataのチェックを入れる

f:id:m_shige1979:20150117210938p:plain

エンティティを追加

f:id:m_shige1979:20150117211748p:plain

エンティティに名前を設定してフィールド要素などを追加

f:id:m_shige1979:20150117212123p:plain

モデルのコードを自動生成する

f:id:m_shige1979:20150117212739p:plain

↓作成されたコード

//
//  Todo.swift
//

import Foundation
import CoreData

class Todo: NSManagedObject {

    @NSManaged var name: String
    @NSManaged var memo: String

}
エンティティのクラス名を変更

f:id:m_shige1979:20150118001752p:plain
※この名前にしないとうまく動かないようなので修正

実装

ナビゲーションとかいろいろしているけど今回は割愛します

ViewController
import UIKit
import CoreData

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    
    @IBOutlet var tableview: UITableView!
    
    // Todoモデルを格納する配列
    var items = [Todo]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        // タイトルを設定
        self.title = "TODO"
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // viewDidLoadは最初の一回しか呼ばれないので、viewWillAppearを使うよ
    override func viewWillAppear(animated: Bool) {
        
        println("cccc")
        
        // AppDelegateクラスのインスタンスを取得
        let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        // AppDelegateクラスからNSManagedObjectContextを取得
        // ゲッターはプロジェクト作成時に自動生成されている
        if let managedObjectContext = appDelegate.managedObjectContext {
            // EntityDescriptionのインスタンスを生成
            let entityDiscription = NSEntityDescription.entityForName("Todo", inManagedObjectContext: managedObjectContext);
            // NSFetchRequest SQLのSelect文のようなイメージ
            let fetchRequest = NSFetchRequest();
            fetchRequest.entity = entityDiscription;
            
            var error: NSError? = nil;
            // フェッチリクエストの実行
            if var results = managedObjectContext.executeFetchRequest(fetchRequest, error: &error) {
                items = []
                for managedObject in results {
                    let model = managedObject as Todo;
                    items.append(model)
                }
            }
        }
        
        
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        // リストの件数を返す
        return  items.count
    }
    
    // セルをitemsから設定する処理
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        cell.textLabel?.text = items[indexPath.row].name
        cell.detailTextLabel?.text = items[indexPath.row].memo
        return cell
    }
    
    // セルをクリックした時に発生するイベント
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
        performSegueWithIdentifier("page1", sender: self)
    }

}
EditController
import UIKit
import CoreData

class EditController: UIViewController {
    
    @IBOutlet weak var name: UITextField!
    @IBOutlet weak var memo: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        // タイトルを設定
        self.title = "Edit"
        
    }
    
    override func viewWillDisappear(animated: Bool) {
        let viewControllers = self.navigationController?.viewControllers!
        if indexOfArray(viewControllers!, searchObject: self) == nil {
            // 戻るボタンが押された処理
            println("back!")
            
            // 追加処理
            if name.text == "" && memo.text == "" {
            }else{
                // AppDelegateクラスのインスタンスを取得
                let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
                // AppDelegateクラスからNSManagedObjectContextを取得
                // ゲッターはプロジェクト作成時に自動生成されている
                if let managedObjectContext = appDelegate.managedObjectContext {
                    // NSEntityDescriptionから新しいエンティティモデルのインスタンスを取得
                    // 第一引数はモデルクラスの名前、第二引数はNSManagedObjectContext
                    let managedObject: AnyObject = NSEntityDescription.insertNewObjectForEntityForName("Todo", inManagedObjectContext: managedObjectContext)
                    
                    // エンティティモデルにデータをセット
                    let todo = managedObject as Todo
                    todo.name = name.text
                    todo.memo = memo.text
                    
                    // AppDelegateクラスに自動生成された saveContext で保存完了    appDelegate.saveContext()
                }
            }
        }
        super.viewWillDisappear(animated)
    }
    
    func indexOfArray(array:[AnyObject], searchObject: AnyObject)-> Int? {
        for (index, value) in enumerate(array) {
            if value as UIViewController == searchObject as UIViewController {
                return index
            }
        }
        return nil
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
}

結果

f:id:m_shige1979:20150118010944g:plain

所感

データの更新や削除はまだない
coredataの使い方の簡単な方法をやってみたけど結構手間取った。
以前やったことも忘れているのがいくつかあったのでもう一度やり直しが必要
コードだけでやる場合とストーリーボードを使う方法でいくつか差異があるので大変