Swift で CoreData の必要な初期データー（マスターデータ）を用意する

アプリケーションをインストールして立ち上げたら、すでに入っていてほしいデーターがあります（例えば、都道府県名とか…）。

# CoraData を使う

* 初めてアプリケーションを作る時であれば、CoreData のチェックボックスにチェックを入れて対応
* 追加で使う場合は、別の話

## CoreData の Entities

![スクリーンショット 2015-04-20 23.20.33.png](https://qiita-image-store.s3.amazonaws.com/0/21321/41ff0bb3-9283-b340-ce70-83bc5e3eb01d.png)


# plist ファイルを作る

* ファイルを追加
* iOS -> Resource -> Property List


![plist.png](https://qiita-image-store.s3.amazonaws.com/0/21321/1ace8093-08c3-94eb-d88f-aa7b5aa66e7e.png)

## 追加したplistのディレクトリ

![スクリーンショット 2015-04-20 23.04.25.png](https://qiita-image-store.s3.amazonaws.com/0/21321/777847a7-ee63-e074-632b-8783654328a2.png)

## plistにデーターを登録する

* ファイルは「Masterdata.plist」
* Dictionary で登録しておく

![スクリーンショット 2015-04-19 16.40.27.png](https://qiita-image-store.s3.amazonaws.com/0/21321/76930a18-6882-73cc-177d-475f78407bd5.png)

### 登録してみたサンプル

![スクリーンショット 2015-04-20 23.16.09.png](https://qiita-image-store.s3.amazonaws.com/0/21321/a41c0524-3dcc-cde2-176e-af58644ceca1.png)



## plistからデーターを読み取りデーターを登録する

```swift
    func initMasters() {
        println("initMasters ------------")
       
        // plist の読み込み
        let path:NSString = NSBundle.mainBundle().pathForResource("Masterdata", ofType: "plist")!
       
        var masterDataDictionary:NSDictionary = NSDictionary(contentsOfFile: path)


        let app: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let categoryContext: NSManagedObjectContext = app.managedObjectContext!
       
        for(var i = 1; i<=masterDataDictionary.count; i++) {
            let index_name: String = "Category" + String(i)
            var item: AnyObject = masterDataDictionary[index_name]!
            println(item["name"])
           
            let categoryEntity: NSEntityDescription! = NSEntityDescription.entityForName(
                "Categories",
                inManagedObjectContext: categoryContext
            )
            var new_data  = NSManagedObject(entity: categoryEntity, insertIntoManagedObjectContext: categoryContext)
            //new_data.name = item["name"] as String
            new_data.setValue(item["name"] as String, forKey: "name")
           
            var error: NSError?
            categoryContext.save(&error)
        }
       
       
        println("------------")
    }
```

# データーがあれば実行しない

初期データーは一回登録したら、もういいのでデーターを読み取って存在しなかったら投入することにします（sqliteのファイルの有無とかもあると思うんですけれど）


```swift
    override func viewDidLoad() {
        super.viewDidLoad()       
        var results:NSArray = readData()
        if(results.count == 0) {
            // 初期データーの投入
            initMasters()
            results = readData()
        }
    }
```

# 全体

```swift
//  ViewController.swift
//  TestAppCoreDataInitApp01

import UIKit
import CoreData

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        var results:NSArray = readData()

        if(results.count == 0) {
            // 初期データーの投入
            initMasters()
            results = readData()
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func readData() -> NSArray{
        println("readData ------------")
        let app: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let categoryContext: NSManagedObjectContext = app.managedObjectContext!
        let categoryRequest: NSFetchRequest = NSFetchRequest(entityName: "Categories")

        var results: NSArray! = categoryContext.executeFetchRequest(categoryRequest, error: nil)
        for data in results {
            println("------------")
            println(data.name?)
            println("------------")
        }
        
        return results
    }
    
    func initMasters() {
        println("initMasters ------------")
        
        // plist の読み込み
        let path:NSString = NSBundle.mainBundle().pathForResource("Masterdata", ofType: "plist")!
        
        var masterDataDictionary:NSDictionary = NSDictionary(contentsOfFile: path)


        let app: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let categoryContext: NSManagedObjectContext = app.managedObjectContext!
        
        for(var i = 1; i<=masterDataDictionary.count; i++) {
            let index_name: String = "Category" + String(i)
            var item: AnyObject = masterDataDictionary[index_name]!
            println(item["name"])
            
            let categoryEntity: NSEntityDescription! = NSEntityDescription.entityForName(
                "Categories",
                inManagedObjectContext: categoryContext
            )
            var new_data  = NSManagedObject(entity: categoryEntity, insertIntoManagedObjectContext: categoryContext)
            //new_data.name = item["name"] as String
            new_data.setValue(item["name"] as String, forKey: "name")
            
            var error: NSError?
            categoryContext.save(&error)
        }
        
        
        println("------------")
    }
    
}

```

# 実行環境

* Xcode 6.0
* iOS 8

# 参考

* http://onot.tumblr.com/post/33772954734/coredata