うるおいらんど

アプリ開発やサイト制作のメモとか。

【Swift 3】Core Dataを使ってみた【part1】

魚ライン
魚ライン

どうも。

ついにCoreDataを使う必要が出てきたので、現在進行形で奮闘中ですが、同時進行で記事も書いていこうと思います。

CoreData自体の記事はたくさん出てくるのですが、Swift3に対応したのはまだまだ情報が少なく苦戦しています。

 

 

CoreDataってなんだ?

CoreDataとは、iPhoneアプリでデータを永続的に保存できる仕組みの一つです。 データを扱う機能が豊富にそろっているようで、便利なフレームワークのようです

参照:http://www.yoheim.net/blog.php?q=20120616
 

以前CoreDataを触る機会が一度あったのですが、上手くいかず、結局CoreDataを使わずにデータを保存する方法をとりました。

その方法がこちら:【Swift】NSData/NSFileWrapperを利用してデータを保存する

記事はSwift2時代ですのでちょっと違うところもあると思いますがご了承ください・・・(そのうち書き換えます)

NSData等を用いる方法ではなくCoreDataを用いるのは、どのような場合かというと、「大量のデータの中から一部のみを検索して利用する場合」などが挙げられると思います。

実際やってみるとCoreDataの方がすっきりしてデータの管理が楽になると思います。

 

CoreDataを導入しよう!

最初にプロジェクトを作成する際に「 use CoreData」にチェックを入れていなかったので、その状態から始めます。

今回は人物のデータを保存・ロードをしていこうと思います

 

File > New > File を選択

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-26-16-59-52

 

 

CoreData > DataModelを選択

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-26-17-00-17

 

Next > CreateでDataModelを作成します。

名前は適当にcoredataTestにしました。coredataTest.xcdatamodeledというファイルがファイルに追加されます。

 

次にcoredataTest.xcdatamodeledのファイルを開いて、AddEntityよりEntityを追加します

 

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-26-17-06-50

 

 

名前を「Person」にしておきます

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-26-17-09-32

 

今回は人物データとして、名前/性別/国 を基本データとして保存しようと思います。

 

Attributesのところで名前/性別/国をそれぞれ追加します。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-26-17-20-01

Typeはそれぞれの型を指定します。

 

relationshipとかはとりあえず置いといてこれだけの情報を保存していきます。

これらを元にエンティティモデルのコードを生成します。

Editor > Create NSManagedObject Subclass

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-26-17-23-24

 

Personにチェックを入れて作成。

このようなファイルが追加されていればOKです。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-26-17-23-51

 

(2017/09/07 追記)このとき、もしも「’Person’ is ambiguous for type lookup in this context」というエラーが出た場合は、以下を参考にしてください!

【Swift 3】CoreDataを使うときに「’Entity’ is ambiguous for type lookup in this context」というエラーが出たとき

 

AppDelegateにコードを書こう

use CoreDataにチェックを入れていた場合は既に書かれていますが、途中から導入する場合は手動で追加しなければいけません。

基本的に別プロジェクトをuse CoreDataにチェックを入れた状態で作って、AppDelegateのCoreDataの部分を丸々持ってくればいいのですが、Swift3になってiOS10仕様になってしまいiOS10未満の対応ができなくなってしまいます。

TargetがiOS9や8だった場合は、このようなエラーが出てしまいます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-26-17-31-07

 

要はこのNSPersistentContainerがiOS10からじゃないと使いないよってことですね。

流石にiOS10のみ対応といくわけにもいかないので(実機がないのでテストもできない!)

ならば昔の方から持って来ればいいんじゃ・・・と思い、古いXcodeがたまたまあったので、そこから流用。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-26-17-36-52

 

こんな感じでエラーがいっぱい出てきますが、言われた通りに全て直していけば大丈夫です。

このままでも、一応iOS10まで動きました。

コピーしてきたときは

forResourceの部分を、先ほど作成した.xcdatamodeledファイルの名前と対応するようにしてください。

 

念のため(?)、iOS10では先ほどのNSPersistentContainerを用いるようにしました。

長いですが全文コードを貼っておきます・・・。

AppDelegate.swift

 

長いのでコメントアウトされている部分は端折りました。

 

データを保存しよう

保存したい場所でimport CoreDataを書いておきます。

 

 

先ほどappDelegateに書いたコードを利用して保存していきます。

上記の書き方はSwift2の書き方でSwift3の書き方はこちら

 

簡潔ですごくわかりやすいのですが、これまたiOS10からじゃないと使えないよって言われてしまいます。

なのでとりあえず前者の書き方でいいのかなぁと思っています・・・。availableで分ける必要ない、よね・・・?

 

※修正しました(2016/10/16)

一応saveContext()はapplicationWillTerminateで呼んでいるので書いていない場合もありますが、これはアプリが終了する直前に呼ばれるやつなので、やはりその場で呼び出しておいた方がいいんじゃないかなぁと思います。

 

appDelegate.saveContext()ではアプリを終了するとデータが消えてしまいました。

アプリ起動状態では保存されているのですが、一度落とすとデータが消えて保存されないです。

context.save()と書くことで保存に成功しました。

 

データを取り出そう!

データのロードは以下のようにしました。

とりあえず名前だけを取り出す感じになっています。

 

全て取り出すときは

 

こんな感じにしました。

let person = Person()とするとFailed to call Designated Initializer on NSManagedObject Classといったエラーが出てしまったので調べてみると、保存するときと同じようにしないといけないっぽいです。

こちらを参考にしました:Failed to call Designated Initializer on NSManagedObject Class — CoreData

 

結局AppDelegate内に書いたiOS10用のやつは役に立ってない気もしますが気にしない(気になる・・・

 

とりあえずまだこの辺までしか触ってないので、更新・削除等はまた次回に書きます…

part2書きました!【Swift 3】CoreDataを使ってみた。検索・更新・削除編【part2】

 

私自身CoreDataを触るのがほぼ初めてみたいなものなので改善点等ありましたらぜひ教えてください(´・ω・)(´-ω-)) ペコリ

 

参考記事:

What’s new in Core Data Swift 3.0
SwiftでCoreData実装
SwiftでCoreData
Swift 3 Core Data fetch issue

魚ライン
モッピー!お金がたまるポイントサイト
魚ライン

Swiftの記事一覧を見る

コメント

頭
アバター

ふくまめ

尻尾

swift3からの初学者です。
coreData の取扱が全くわからずに苦慮しておりましたが、本記事はとても参考になり
自分の環境でも再現させることができました。
ありがとうございました。

    頭
    アバター

    Reo(管理人)

    尻尾

    初めまして。
    お役に立てたようで嬉しいです。
    こちらこそコメントすごく励みになります。
    わざわざありがとうございます!

コメントは認証制です。詳しくは下記の注意をお読みください。

コメントを残す

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

魚ライン 魚ライン