core data バッドプラクティス
DESCRIPTION
2013年11月札幌iPhone開発懇談会勉強会プレゼンテーション資料。 iOS CoreData徹底入門 販売記念。CoreData のバッドプラクティスを紹介します。TRANSCRIPT
![Page 1: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/1.jpg)
CoreData バッドプラクティス
![Page 2: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/2.jpg)
お題目•簡単な自己紹介
• CoreData 書籍
•バッドプラクティスCoreData
•バッドプラクティスからのリカバリ
![Page 3: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/3.jpg)
簡単な自己紹介
• iPhoneのアプリ開発者
•頭わるいアプリ開発
•アプリの企画提案(サービス/フレームワークの提案)
•喫茶作業者
![Page 4: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/4.jpg)
開発アプリWifiルーター用アプリ
印刷サービス用アプリ
![Page 5: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/5.jpg)
CoreData の書籍
![Page 6: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/6.jpg)
iOS CoreData徹底入門•前半sqlite、後半CoreDataの構成
•利用ケースに基づいたサンプルコード
•マルチスレッドについて言及なし
•バイナリを格納する方法について詳しい
![Page 7: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/7.jpg)
CoreData を使う ユーザが増えるのは うれしいかぎり。
![Page 8: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/8.jpg)
ただしCoreDataで 思わぬ罠に陥る事も…
![Page 9: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/9.jpg)
そもそも使う 必要がある?
![Page 10: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/10.jpg)
SQLライクにデータを永続化&問い合わせ機能を実現するのであれば(既にsqliteに関する知識があれば)sqlite も選択肢かも。
![Page 11: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/11.jpg)
規模がそれ程大きくない場合は、NSArray、NSDictionary で永続化、NSPredicate を使って絞り込みが可能。
![Page 12: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/12.jpg)
規模がそれ程大きくない場合は、NSArray、NSDictionary で永続化、NSPredicate を使って絞り込みが可能。
![Page 13: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/13.jpg)
NSPredicte による データの問い合わせ
• NSPredicate によるデータの問い合わせが可能
•指定方法がNSString のフォーマット分に近いものが使える(同じではない)
• plist で絞り込めるのは(500-1000要素ぐらいが限界)
![Page 14: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/14.jpg)
https://github.com/notoroid/SimpleSearch
NSPredicateについては サンプルコード参照
![Page 15: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/15.jpg)
![Page 16: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/16.jpg)
CoreDataの特徴• NSPredicte によるデータの問い合わせ
•データモデルのアップグレードがそこそこ整備(マイグレーション)
•データの永続化とオブジェクト管理が分離されている(取り消しやマルチスレッドにも応用可)
•オブジェクトっぽく扱える
![Page 17: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/17.jpg)
データの永続化•オブジェクトの形でデータを永続化できる
オブジェクトの形でなければ他の選択肢で良くないのでは?
![Page 18: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/18.jpg)
データモデルの アップグレード機能がそこそこ整備
•複数のデータモデルを定義して、データモデル間のデータモデルのアップグレードが可能
•データモデル間のアップグレード方法を指定することができる(自動、手動)
• sqlite でもできないことはない
![Page 19: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/19.jpg)
オブジェクトっぽく扱える
• NSManagedObject がCoreDataのオブジェクト。NSManagedObject から値を取得
• NSManagedObject をカスタマイズして、オブジェクトのプロパティのように扱うことも可能
![Page 20: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/20.jpg)
CoreData の立ち位置は?• sqlite や、plist で実現可能な事が重複している。
•オブジェクトを永続化することに関して網羅的だがCoreDataを使う上で抑えておくことが多い。
• iOS SDKでもミドルウェア的扱い。
![Page 21: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/21.jpg)
CoreData を採用するに あたって
•データモデルの継続的アップグレードが必要?
•バックグラウンドとフォアグランドでデータの更新が必要?
•他のアプリ開発でもステレオタイプにデータを扱いたい?
![Page 22: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/22.jpg)
もしそうでなければ 他の手段を探してみて
は?
![Page 23: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/23.jpg)
バッドプラクティスCoreData
![Page 24: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/24.jpg)
CoreData を使う上で 悪い例を紹介
![Page 25: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/25.jpg)
バッドプラクティス① CoreData の
ミドルウェアを使う
![Page 26: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/26.jpg)
MagicalRecord
•パッケージ管理(CocoaPods) で見つかる
•データモデルに基づいてカスタムクラスを自動生成&マイグレーション機能を提供
• CreDataを使う上で便利な機能を提供
![Page 27: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/27.jpg)
MagicalRecord•カスタムクラス
•無駄に巨大(全文検索の邪魔)
•検索できる有益な情報がCoreDataそのものより少ない。
•デフォルトのストレージ位置がBundleDisplayName(アプリの表示名)
![Page 28: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/28.jpg)
デフォルトのストレージ位置がBundleDisplayName(アプリの表示名)
•アプリの表示を変えると、以前の保存用データのパスを忘れてしまう。
•アプリの表示名を変更するだけで、データベースが消去されたように錯覚してしまう。
![Page 29: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/29.jpg)
何が言いたいかと いうと
![Page 30: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/30.jpg)
初期の開発スピードは稼げるが、メンテナンスに伴う作業は悲惨なものになる
![Page 31: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/31.jpg)
MagicalRecord へのフォロー
•おそらくは、Twitter やFacebookページをなどもオフラインデータの利用を想定したもの
•ユーザの貴重なデータを取り扱うことはあまり想定されていないかもしれない。
![Page 32: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/32.jpg)
技術査定の問題
•検索経由で探し出したミドルウェアは技術の査定ができてないかも?
•パッケージ管理に対応しているミドルウェアは最良の解決方法?
![Page 33: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/33.jpg)
バッドプラクティス② データの中に画像
![Page 34: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/34.jpg)
データの中に画像
• CoreDataのデータモデルに定義にバイナリデータを指定可能
•イメージもバイナリデータの形で保存可能
•ファイルで保存するよりも管理が楽。
![Page 35: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/35.jpg)
•本来サムネイルだけだったのがいつの間にか多用
•格納する画像解像度を高くすると、永続化データのサイズが巨大化。メモリオーバーで落ちる
•シミュレータや、最新機種だけでテストすると問題を発見できない
![Page 36: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/36.jpg)
まとめ•ミドルウェア相当のCoreDataに対して、ミドルウェアは蛇足かも?
•パッケージ管理で取り入れるミドルウェアは用途に応じて査定しましょう。査定しないミドルウェアを納品するとあなたの信用が目減りします。
•データモデルへの画像を含める事は可能であっても、それが妥当か検討しましょう。
![Page 37: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/37.jpg)
バッドプラクティス からのリカバリ
![Page 38: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/38.jpg)
バッドプラクティス 満載のアプリを
リリースしてしまった。
![Page 39: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/39.jpg)
もうお手上げ?
![Page 40: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/40.jpg)
CoreData 様は バッドプラクティス満載の アプリにも救いの手を 差し伸べてくれます。
![Page 41: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/41.jpg)
バッドプラクティス からの脱却
•データモデルをアップグレードして大きなバイナリデータを外に追い出す。
•データモデルのアップグレードには、データモデルマッピングを使う。
•バイナリデータを外に書き出すには手動アップグレードを用意する。
![Page 42: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/42.jpg)
新しい属性を追加するだけであれば、データマッピングファイルは必要ない。
![Page 43: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/43.jpg)
データモデル内の属性名を変更程度であればモデルマッピングソフトの作成だけで済む。
![Page 44: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/44.jpg)
![Page 45: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/45.jpg)
デモコード
![Page 47: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/47.jpg)
注意点
•データモデルの名前にアンダーバー(_) を使うとデータマッピングを読み込まなくなる
•誤ったデータモデルを追加した場合は、手動でプロジェクトファイルを編集する必要が出てくる
![Page 48: Core Data バッドプラクティス](https://reader035.vdocuments.net/reader035/viewer/2022062220/558a2e6fd8b42ac25d8b460a/html5/thumbnails/48.jpg)
まとめ
• iOS CoreData 徹底入門 が出たことCoreData が身近になりました。
•ステレオタイプにiOSアプリのデータを扱いたいのであれば、この機会に学んでみてはいかがでしょう?