28
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-04-20

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

CoraData を使う

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

CoreData の Entities

スクリーンショット 2015-04-20 23.20.33.png

plist ファイルを作る

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

plist.png

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

スクリーンショット 2015-04-20 23.04.25.png

plistにデーターを登録する

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

スクリーンショット 2015-04-19 16.40.27.png

登録してみたサンプル

スクリーンショット 2015-04-20 23.16.09.png

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

    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のファイルの有無とかもあると思うんですけれど)

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

全体

//  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

参考

28
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?