Amarronの日記

iOSやMac、Web系の記事を書きます。

CoreData の 関連図 と 手順

概要

  • CoreDataの知識が曖昧だったのでクラスの関連図や手順についてのメモです(細かい実装方法や使い方は他の参考サイトを参考にしてください)
  • DB自体初めての人には登場人物が多くて難易度高めな気がします
  • 参考資料:iOS Core Data チュートリアル

関連図

f:id:Amarron:20150121224913p:plain

Core Data RDB
NSManagedObjectModel DB
Entity Table
NSManagedObject Record
Attribute Column
  • NSManagedObjectModel:管理オブジェクトモデル(データベース)

f:id:Amarron:20150121224955p:plain

  • NSManagedObject:管理オブジェクト(レコード)
  • NSManagedObjectContext:管理オブジェクトコンテキスト(オブジェクト空間、管理オブジェクトのコレクションを管理する)

f:id:Amarron:20150121225004p:plain

  • NSPersistentStoreCoordinator:永続ストアコーディネータ(ストアを管理して、管理オブジェクトコンテキストに、1つ の統一されたストアのファサードを提供する)

f:id:Amarron:20150121225014p:plain

作成手順

  1. プロジェクトの準備
    • Xcodeで、「iOS」セクションの「Window-basedApplication」テンプレーを使用してプロジェクトを作成します。オプション(Options)(Options)セクションで、ストレージにCore Dataを使用するスイッチ(「Use Core Data for storage」)を選択
      • AppDelegateクラスにCoreData用のプログラムが追加され、【プロジェクト名】.xcdatamodeldが作成される
  2. テーブルの作成
    • Xcodeのデータモデリングツール(プロジェクト名】.xcdatamodeld)を使用して、新規エンティティを作成
    • f:id:Amarron:20150121225041p:plain

    • そのエンティティを表すカスタムクラス(NSManagedObject)を作成(xcdatamodeldを選択し、「Create NSManagedObject」で作成可能)

  3. テーブルにデータ追加
    • NSManagedObjectContextでDML操作(レコードの追加・検索・更新・削除など)
    • NSEntityDescriptionでテーブルの指定
    • NSManagedObjectで値の受け渡し
  4. テーブルからデータ取得
    • NSManagedObjectContextでDML操作(レコードの追加・検索・更新・削除など)
    • NSFetchRequestでテーブルの指定
import CoreData

class MyClass : UIViewController {
// 3. テーブルにデータ追加
@IBAction func insert(sender: AnyObject) { 
        let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let managedContext: NSManagedObjectContext = appDelegate.managedObjectContext!
        
        /* Create new ManagedObject */
        let entity = NSEntityDescription.entityForName("テーブル名", inManagedObjectContext: managedContext)
        let personObject = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)
        // let myPersonObject = NSManagedObjectを継承したカスタムクラス(entity: entity!, insertIntoManagedObjectContext: managedContext) // 自分で作成したカスタムを使う場合
        
        /* Set the name attribute using key-value coding */
        personObject.setValue("値", forKey: "カラム名")
        // myPersonObject.カラム名 = "値" // 自分で作成したカスタムを使う場合
        
        /* Error handling */
        var error: NSError?
        if !managedContext.save(&error) {
            println("Could not save \(error), \(error?.userInfo)")
        }
        println("object saved")
}

// 4. テーブルからデータ取得
@IBAction func selectAll(sender: AnyObject) { 
        /* Get ManagedObjectContext from AppDelegate */
        let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let manageContext:NSManagedObjectContext = appDelegate.managedObjectContext!

        /* Set search conditions */
        let fetchRequest = NSFetchRequest(entityName: "テーブル名")
        var error: NSError?
        
        /* Get result array from ManagedObjectContext */
        let fetchResults = manageContext.executeFetchRequest(fetchRequest, error: &error)
        if let results: Array = fetchResults {
            for obj:AnyObject in results {
                let name:String? = obj.valueForKey("カラム名") as? String
                println(name)
            }
            println(results.count)
        } else {
            println("Could not fetch \(error) , \(error!.userInfo)")
        }
}

まとめ

  • xcdatamodeldでテーブル情報(テーブル名、カラム名、カラム属性、リレーション等)を設定する
  • NSManagedObjectを継承したクラスをテーブルのカラム名を書いて、テーブルとの受け渡し用の入れ物に使う
  • NSManagedObjectContextでDML操作(レコードの追加・検索・更新・削除など)
  • NSEntityDescriptionでテーブルの指定
  • データの保存場所を確認したい場合、applicationDocumentsDirectoryを見る
  • 個人的には、FMDBのライブラリを使って直接SQLでデータをやりとりした方が自由で楽なきがします。。。

参考サイト