Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

[Swift] プロパティリスト(plist)を使ってCoreDataで一括登録する

公開日: : 最終更新日:2014/12/09 iPhone App 開発, Swift


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

プロパティリストを使う

初期データやあらかじめ用意したデータを一括登録したい場合、プロパティリストを使うと便利です。
プロジェクトの設定などは、info.plistとしておなじみですね。
構造としてはxml形式でKey、Type、Valueとして登録が可能です。
入力する際に各項目をCoreDataと適合させて登録します。

  • plistのファイル名 = CoreDataのエンティティ名
  • Key = エンティティのAttribute
  • Type = エンティティのType
  • Value = エンティティのデータ値

今回は以前の記事を雛形に、SampleEntityテーブルにflg項目を追加しました。
スクリーンショット 2014-11-25 15.59.32
このエンティティにこれから用意するplistから一括登録してみたいと思います。

SampleEntity.plist(プロパティリストの新規作成)

名前はSampleEntity.plist、これに以下のようにデータを入力します。
スクリーンショット 2014-11-26 16.09.13
RootをArrayにして、各項目をDictionaryに追加していきます。
KeyとTypeをエンティティに合わせること。
例では計3データになります。

SampleEntity.swift

そしてSampleEntityのNSManagedObjectは以下のように修正してください。

import Foundation
import CoreData

@objc(SampleEntity)
class SampleEntity: NSManagedObject {

    @NSManaged var id: NSNumber?
    @NSManaged var name: String?
    @NSManaged var flg: NSNumber?

}

@objc(SampleEntity)を書いておかないと警告が出てしまうので追加。

AppDelegate.swift

AppDelegate.swiftに以下の関数を追加してください。

func insertDataFromPlist(entityName: String, managedObjectContext: NSManagedObjectContext) -> NSError? {
    NSFetchedResultsController.deleteCacheWithName(nil)
    let managedObjectModel = managedObjectContext.persistentStoreCoordinator?.managedObjectModel
    let attrs = managedObjectModel?.entitiesByName[entityName]?.attributesByName
    let path = NSBundle.mainBundle().pathForResource(entityName, ofType: "plist")
    var keyedValues = NSArray(contentsOfFile: path!)!

    for keyedValueDict in keyedValues {
        let managedObject: AnyObject = NSEntityDescription.insertNewObjectForEntityForName(entityName,
            inManagedObjectContext:managedObjectContext)
        if let attributeArray = attrs as? [String: NSAttributeDescription] {
            for attributeKey in attributeArray.keys {
                let value: AnyObject? = keyedValueDict.objectForKey(attributeKey)
                if value == nil {
                    continue
                }
                let attributeType = attributeArray[attributeKey]?.attributeType
                if attributeType == NSAttributeType.StringAttributeType && value is NSNumber {
                    let value = value?.stringValue
                } else if ((attributeType == NSAttributeType.Integer16AttributeType)
                    || (attributeType == NSAttributeType.Integer32AttributeType)
                    || (attributeType == NSAttributeType.Integer64AttributeType)
                    || (attributeType == NSAttributeType.BooleanAttributeType)) && value is NSString
                {
                    let value = value as NSNumber
                }
                else if attributeType == NSAttributeType.FloatAttributeType && value is NSString
                {
                    let value = value as NSNumber
                }
                managedObject.setValue(value, forKey: attributeKey)
            }
        }
    }
    var error: NSError? = nil
    managedObjectContext.save(&error)
    return error?
}

まずNSFetchedResultsControllerのキャッシュをクリア。
managedObjectModelからエンティティの属性を取得し、plistから取得した値をタイプによって格納していきます。
8行目のfor文でplistのデータ数分繰り返します。
12行目のfor文で属性ごとにTypeを判断してNSManagedObjectに格納します。
36行目でデータを保存。

今回は起動時に登録するのでAppDelegateのdidFinishLaunchingWithOptionsに上記の関数を呼び出します。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    let navigationController = self.window!.rootViewController as UINavigationController
    let controller = navigationController.topViewController as MasterViewController
    controller.managedObjectContext = self.managedObjectContext

    self.insertDataFromPlist("SampleEntity", managedObjectContext: self.managedObjectContext!)

    return true
}

MasterViewController.swift

データ表示のconfigureCellを以下のように修正。

func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) {
    let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as SampleEntity
    cell.textLabel?.text = "\(object.name!) (id:\(object.id!) flg:\(object.flg!))"
}

結果

iOS Simulator Screen Shot 2014.11.26 15.58.13

まとめ

データ量が少なければUserDefaultsを使うのも一つの考えですが、今回のようにデータ量が肥大する可能性がある場合はプロパティリストを使ったほうが便利だと思います。

ad

関連記事

[Objective-C] no architectures to compile for … のコンパイルエラーについて

起動したプロジェクトでコンパイルエラーが出ました。 no architectures to com

記事を読む

[Objective-C] バージョン更新時に変更内容をアラートで出力する

アプリの更新内容を表示したい! バージョン更新時に変更内容を表示させたいのは、ユーザーがいちいちA

記事を読む

[iPhone App] WorkManager 1.2.0版がリリースされました。

新機能 以前から要望などが多かったものを元に、機能を追加いたしました。 新バージョンで追加された

記事を読む

[Swift] ビルド時のエラー&iOS8でNSBigDecimalのバグ

ビルド時のエラー Swiftプロジェクトを実行中に以下のエラーが出ました。 "__TFSs15_

記事を読む

備忘録的メモ

Xcode5にアップデートして、とりあえずアプリを走らせてみたらナビゲーションバーがかぶってる・・・

記事を読む

[Swift] CoreDataを使ってみる

SwiftでCoreData 今回はSwiftでCoreDataを使ってみます。 Xcodeプロ

記事を読む

[Swift] UITableViewのセルにアクションを設定する

セル選択→アクション UITableViewControllerを使用したテーブルビューの画面があ

記事を読む

[Swift] CoreDataで検索したデータを削除する

CoreDataの検索と削除 前の投稿  CoreDataを使ってみる をふまえて今度は検索&削除

記事を読む

[Objective-C] iPhoneアプリからのメーラー起動

今回はiPhoneアプリからメーラーを起動する処理を紹介します。 メーラー起動のコントローラー

記事を読む

[Swift] プロパティリスト(plist)の値を取得

plistからデータを取得してみます。 こちらのエントリーも参考にしてみてください。 プロパテ

記事を読む

ad

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ad

[PHP] curl転送してみる(googleに)

curlでgoogle画像検索APIにアクセスしてみます。 cu

[PHP] PDOでMySQLの接続確認をする

PDO PHPでMySQLに接続する際には、mysql_connec

[PHP] ランダムな英数字を生成する

便利系メソッド 今回はPHPでランダムな英数字を作成してみます。

[Swift] プロパティリスト(plist)の値を取得

plistからデータを取得してみます。 こちらのエントリーも参考にし

[Swift] Asset Catalogについて

XCode5から追加されたAsset Catalog。 いままで標準

→もっと見る

  • 1978年の七夕生まれ。 25才でweb業界の門を叩き、28才でフリーランスに。 現在は、フリーランスでマークアップ中心に、wordpressのカスタマイズやデザインをしております。 また、iPhoneアプリの開発もしております。

Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524
PAGE TOP ↑

Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524