[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項目を追加しました。

このエンティティにこれから用意するplistから一括登録してみたいと思います。
SampleEntity.plist(プロパティリストの新規作成)
名前はSampleEntity.plist、これに以下のようにデータを入力します。

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!))"
}
結果
まとめ
データ量が少なければUserDefaultsを使うのも一つの考えですが、今回のようにデータ量が肥大する可能性がある場合はプロパティリストを使ったほうが便利だと思います。
ad
関連記事
-
-
[Objective-C] バージョン更新時に変更内容をアラートで出力する
アプリの更新内容を表示したい! バージョン更新時に変更内容を表示させたいのは、ユーザーがいちいちA
-
-
[Swift] CoreDataを使ってみる
SwiftでCoreData 今回はSwiftでCoreDataを使ってみます。 Xcodeプロ
-
-
[Swift] プロパティリスト(plist)の値を取得
plistからデータを取得してみます。 こちらのエントリーも参考にしてみてください。 プロパテ
-
-
[iPhone App] WorkManager 1.2.0版がリリースされました。
新機能 以前から要望などが多かったものを元に、機能を追加いたしました。 新バージョンで追加された
-
-
[Objective-C] 文字列操作の便利Tips
Tipsいろいろ 先日の投稿 共通関数をまとめたクラスを作ろう!の流れで、文字列を操作するときに便
-
-
[Swift] 関数型プログラミング
関数型プログラミングについて、ストーリー仕立ての面白い記事がありましたので紹介します。 IQ1
-
-
OSSの使い方がわからない・・・。
チュートリアル系の、storyboradでview controllerを置いて画面遷移を設定してっ
-
-
TabBarControllerとNavigationControllerのボタン追加
TabBarとNavigationを同時に使っているViewControllerの場合、naviga
-
-
小さなことからコツコツと
これまでHTMLとCSSだけで生きてきただけあって、プログラム言語がいまいちわからない。 Mo
-
-
[Swift] Asset Catalogについて
XCode5から追加されたAsset Catalog。 いままで標準のImages.xcasset
