【Swift】MagicalRecordを使って簡単なメモアプリを作る

スポンサーリンク
Swift(iPhone)

iphoneアプリのデータを保存するときに使用されるCoreData。前回はCoreDataデータを扱うための基本部分を取り上げましたが、巷ではMagicalRecordというライブラリを使った方が便利だと言われています。

今回はそのCocoaPodsを使ったMagicalRecordのインストールと、簡単なデータの登録・読み出し・削除の方法を試してみます。

手順

プロジェクトの新規作成

まずはプロジェクトを新規作成します。名前は「MagiRecSample」としておきます。テンプレートは「Single View Application」を選択してください。今回はCore Dataのチェックが必要になります。手順の詳細は以下をご参照ください。

「基礎手順:プロジェクトの新規作成」

 

MagicalRecordのインストール

プロジェクトが作成されたら一旦閉じて、CocoaPodsでMagicalRecordをインストールします。まだCocoaPodsを導入していない方は、以下のリンク先の方法でプロジェクト作成前までの手順を終えれば使えるようになります。

iOSライブラリ管理「CocoaPods」のインストール(96COLORさん)

 

CocoaPodsが使えるようになったら、ターミナルを起動してプロジェクトを作成したディレクトリにcdコマンドで移動します。そこでおもむろに以下のコマンドを実行します。

pod init

 

するとPodfileというファイルが作成されますので、中身を少し編集します。フレームワークの部分のコメントを外すのと、MagicalRecordを使用を宣言する行を追加します。今回はバージョンを指定していませんがバージョン2.3.2.がインストールされました。バージョンが変わると使い方も変わる可能性があるのでご注意ください。

# Uncomment this line to define a global platform for your project
# platform :ios, '8.0'
# Uncomment this line if you're using Swift
use_frameworks!

target 'MagiRecSample' do
  pod 'MagicalRecord'
end

 

編集が終わったら、またターミナルで以下のコマンドを実行します。これでインストールが完了します。

pod install

 

今後はプロジェクトファイルの代わりにMagiRecSample.xcworkspaceというファイルでプロジェクトを開くようにしましょう。

 

CoreDataの設定

post-1766_03最初にCoreデータの準備をします。Use Core Dataにチェックをしてプロジェクトを作成すると、左側のファイル一覧にCoreData用のファイルも追加されます。これを選択して下にある「Add Entity」ボタンを押しましょう。Entityというのは保存するデータを格納する入れものだと思ってください。

 

 

 

post-1766_04次に今作ったEntityを選択して初期設定を済ませましょう。右上にある「Data Model Inspector」を選択してNameとClassに”Memo”と入力し、Moduleの項目では「Current Product Modue」を選択してください。

 

続いてどんなデータを保存するか設定します。post-1766_06Attributesの項目にある「+」マークをクリックして、今回は入力されたテキストの内容を保存するだけなのでAttributeに”text”を入力、Typeで「String」を選択して1項目だけ作ります。これで入れ物の初期設定ができました。

 

select_data_modelsここまでできたら、あと一息。今までの設定からクラスファイルを作成します。CoreData用のファイルをクリックして、メニューの「Editor」から 「Create NSManagedObject Subclass」を選択します。するとファイルを作成する対象となるCoreDataモデルを指定する画面が表示されるので 「MagiRecSample」を選択します。

 

 

 

post-1766_09今度はどのEntityのファイルを作成するかを指定します。1つしかないので「Memo」を選択して次に進みます。

 

 

 

 

where_to_saveファイルの保存画面が表示されたら、gourpで青いアイコンのMagiRecSampleの方を選択しておきましょう。場所が違っていると、せっかく作ったCoreDataの設定がプログラムから参照できなかったりすることがあります。

 

 

CoreData_filesこれでようやくCoreDataを扱うためのファイルが作成されました。

 

 

 

 

オブジェクトの配置

CoreDataの設定が終わったら画面の設計に入ります。簡単にメモの入力欄と内容の保存、削除ができるだけのシンプルな作りにしたいと思います。

set_objectsストーリーボード上にテキストフィールド1つと、ボタンを2つ配置してください。テキストフィールドは何も設定しないと文字を入力するときにキーボードが表示されるので、隠れてしまわないように上の方に作るか以下を参考にしてキーボードが隠れないようにしましょう。

テキストフィールドがキーボードに隠れないようにする方法【Swift低空飛行ガイド】

 

また、2つ作成したボタンには表示される文字も設定しましょう。画面右上にある「Attributes Inspector」を選択して、Titleの下の項目に”保存”、”削除”とそれぞれ入力してください。

 

テキストフィールドのアウトレット接続とボタンのアクション接続

今度はストーリーボード上に作成したテキストフィールドとボタンを、プログラム側から扱えるように接続します。テキストフィールドはデータを表示させるためにアウトレット接続します。名称は”txtMemo”にしておきます。

アウトレット接続作成の詳細は以下をご参照ください。

「基礎手順:アウトレット接続」

 

残りのボタン2つはボタンが押されるというアクションが発生した時に呼び出されるよう、アクション接続にします。名前はそれぞれ”pressSaveButton”、”pressDeleteButton”にしておきましょう。

「基礎手順:アクション接続」

 

MagicalRecordを使う準備

まずはMagicalRecordのお約束からです。AppDelegate.swiftにMagicalRecordをインポートします。

import UIKit
import CoreData
import MagicalRecord

 

同じくAppDelegate.swift内のapplicationファンクションに以下の1行を追加します。returnの前に入れてください。

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        MagicalRecord.setupCoreDataStackWithAutoMigratingSqliteStoreNamed("MagiRecSample.sqlite")
        return true
    }

次も同じくAppDelegate.swift内のapplicationWillTerminateファンクションに以下の1行を追加します。

    func applicationWillTerminate(application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
        // Saves changes in the application's managed object context before the application terminates.
        MagicalRecord.cleanUp()
        self.saveContext()
    }

 

ここで一度実行してみましょう。エラーが出ていても実行すると消えたりする場合があります。環境によってはこの辺で引っかかるかもしれませんが、Podfileの内容やCoreDataのファイル作成先などを確認してみてください。

 

ここからが最後の作り込みです

今度はViewController.swiftの方にMagicalRecordをインポートします。

import UIKit
import MagicalRecord

 

今回のキモになる、CoreDateの操作部分をコーディングします。やってることはたいしたことないのですが、writeDataでは一旦データを探して見つかったらそのデータをアップデート、データがなかったら新しく新規登録です。

readDataやdeleteDateも実はアップデートと同じことをしていて、肝心な部分はデータを操作したら必ずMR_saveToPersistentStoreAndWaitを呼び出してあげることです。

    // データ登録/更新
    func writeData(txtMemo: String) -> Bool{
        var ret = false

        let memoList = Memo.MR_findAll()
        if memoList!.count > 0 {
            // 検索して見つかったらアップデートする
            let memo = memoList![0] as! Memo
            print("UPDATE \(memo.text) TO \(txtMemo)")
            memo.text = txtMemo
            memo.managedObjectContext!.MR_saveToPersistentStoreAndWait()
            ret = true
        }else{
            // 見つからなかったら新規登録
            let memo: Memo = Memo.MR_createEntity()! as Memo
            memo.text = txtMemo
            print("INSERT \(memo.text)")
            memo.managedObjectContext!.MR_saveToPersistentStoreAndWait()
            ret = true
        }
        return ret
    }

    // データ読み込み
    func readData() -> String{
        var ret = ""

        let memoList = Memo.MR_findAll()
        if memoList!.count > 0 {
            // 検索して見つかったら先頭の1件だけ読み込む
            let memo = memoList![0] as! Memo
            ret = memo.text!
            print("READ:\(ret)")
        }
        return ret
    }

    // データ削除
    func deleteData() -> Bool {
        var ret = false

        let memoList = Memo.MR_findAll()
        if memoList!.count > 0 {
            // 検索して見つかったら削除
            let memo = memoList![0] as! Memo
            print("DELETE:\(memo.text)")
            memo.MR_deleteEntity()
            memo.managedObjectContext!.MR_saveToPersistentStoreAndWait()
            ret = true
        }
        return ret
    }

 

あとはイベント部分を作るだけ

あとは起動時とボタンが押された時の動作を追加するだけです。起動時にはデータを読み込んで表示したいので、viewDidLoadに以下の1行を追加しましょう。

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        txtMemo.text = readData()
    }

 

保存ボタンを押された時にはwriteDataを実行します。

    @IBAction func pressSaveButton(sender: UIButton) {
        writeData(txtMemo.text!)
    }

 

削除ボタンを押されたときは画面上に表示されたデータも消して、CoreDataからも削除します。

    @IBAction func pressDeleteButton(sender: UIButton) {
        txtMemo.text = nil
        deleteData()
    }

 

running_MagiRecSampleこれで実行すれば、簡易的ではありますがMagicalRecordを使ったデータの読み書きができるようになります。

今回のサンプルはこちらにアップしました。

 

 

 

 

 

おわりに

MagicalRecordライブラリを使っても基礎となるCoreDataの知識はある程度必要になるので、勉強しておくと理解しやすいでしょう。本当にコーディングが楽になるのかは、もう少し本格的なアプリを作ってみないことには判断できませんが、使っている人も多いので情報も集めやすそうです。

[amazonjs asin=”4797384514″ locale=”JP” title=”本気ではじめるiPhoneアプリ作り Xcode 7.x+Swift 2.x対応 黒帯エンジニアがしっかり教える基本テクニック (ヤフー黒帯シリーズ)”]

[amazonjs asin=”4797386061″ locale=”JP” title=”絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第4版【Swift 2 & iOS 9】完全対応”]

コメント

タイトルとURLをコピーしました