- 更新日: 2015年6月2日
- Swift & iOS
CoreDataの初期データをMagicalRecordで追加
CoreData で最初からデフォルトで入れておきたい初期データを、AppDelegate.swift の中で MagicalRecord を使って追加する処理の例です。Rails でいう rake db:seed のような仕組みは、iOS/Xcode 開発ではないのでしょうかね?ちょっと良くわかりませんでした。
MagicalRecordをSwiftで使う導入〜設定までの手順 | EasyRamble
AppDelegate.swift の func application() で、MagicalRecord によって CoreData をセットアップする処理があるので、その直後に初期データ追加の処理を行うようにしました。このやり方が正しいかはあまり自信ありませんが、とりあえず動きました。
— 環境 —
Swift 1.2
Xcode 6.3.2
MagicalRecord 2.2
初期データ用のファイルを用意
例として、以下のような初期データ用の CSV ファイルを用意します。昨日の Swiftでファイル読み込み&1行ずつ処理 | EasyRamble で使ったもの。
/path/to/data.csv
1 2 3 4 5 |
Mike,male,US,Engineer Yumi,female,Japan,Designer David,male,,Marketing |
CSV のフォーマットは、:name(名前), :gender(性別), :country(出身国), :role(役職)となっています。
MemberProfile モデルを作成
MemberProfile という名前のモデル(NSManagedObject のサブクラス)を作成しておく。Xcode で AppName.xcdatamodeld から MemberProfile エンティティとその属性を作成して、NSManagedObject サブクラスのファイル(MemberProfile.swift)も作成しておきます。
MemberProfile.swift
1 2 3 4 5 6 7 8 9 10 11 |
import Foundation import CoreData @objc(MemberProfile) class MemberProfile: NSManagedObject { @NSManaged var name: String @NSManaged var gender: String @NSManaged var country: String @NSManaged var role: String } |
このモデルを通して、CoreData を操作することになります。
AppDelegate.swift で初期データ追加の処理
用意した CSV ファイルを読み込んで、CoreData に追加します。具体的には AppDelegate.swift の func application() での MagicalRecord.setupCoreDataStackWithAutoMigratingSqliteStoreNamed() 呼び出しの直後に、CoreData の中身が空の場合には、ファイルから読み込んだデータを CoreData に追加する処理を書きました。初期データがセット済みかをチェックして、2回目以降の起動では処理をスキップ。
AppDelegate.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// setup default data func setupDefaultData() { let filePath = "/path/to/data.csv" let data = NSString(contentsOfFile: filePath, encoding: NSUTF8StringEncoding, error: nil) as! String data.enumerateLines { (line, stop) -> () in // csv format -> :name, :gender, :country, :role let item: [String] = split( line, allowEmptySlices: true, isSeparator: { $0 == "," } ) // add default data var newRecord: MemberProfile = MemberProfile.MR_createEntity() as! MemberProfile newRecord.name = item[0] newRecord.gender = item[1] newRecord.country = item[2] newRecord.role = item[3] newRecord.managedObjectContext!.MR_saveToPersistentStoreAndWait() } } func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // for magical record - initialize coredata MagicalRecord.setupCoreDataStackWithAutoMigratingSqliteStoreNamed("AppName.sqlite") // setup default data into coredata sqlite database if it is empty var members: [MemberProfile]! = MemberProfile.MR_findAll() as! [MemberProfile] let firstRecord: MemberProfile? = MemberProfile.MR_findFirst() as? MemberProfile if let first = firstRecord { println("*** Default data is already set up. ***") println("Record count is \(members.count).") } else { println("*** Default data is empty, so set up the defalut data. ***") setupDefaultData() } return true } |
println() のコードは、とりあえず Xcode コンソールでの確認用。MagicalRecord は、Rails の ActiveRecord とほぼ同じ感覚で使えるので、とても使いやすいです。MR_ の接頭辞で始まる MagicalRecord の API をいくつか利用していますが、読めばだいたい分かるかと思います。
SQLite データのファイルを前もって用意した後に、その SQLite ファイルをコピーする方法も使える模様。データ数が多くて初期データ追加の処理が長くかかる場合は、こちらの方法を使ったほうが良さそうです。
MagicalRecordでSQLite初期データをコピーする – ほげほげ(仮)
- Swift & iOS の関連記事
- WKWebView/UIWebViewでウェブページが真っ白
- Unityのインストールと初期設定
- WKWebView/UIWebViewでNavigation Barの下にウェブページが隠れるのを回避
- SwiftでArray(配列)などをシャッフル
- Navigation Controllerで画面遷移させるSwiftコード
- Swiftでタップ/スワイプのイベント処理実装・UITapGestureRecognizerとUISwipeGestureRecognizer
- UIPageViewController画面下部のUIPageControlを非表示にする
- Swiftのバージョン確認・REPL実行
- Xcode7.0アップデートで遭遇した課題2つ
- 正規のXcodeかどうかチェック(XcodeGhostマルウェア騒動)
Leave Your Message!