iOS Core Data 徹底入門
秀和システム
著者:國居貴浩
1 データの永続性とは
本書の目的と必要な予備知識について
1.1 データの保存を考えてみよう
1.1.1 メモリへの記録
1.1.2 ストレージへの記録
1.1.3 データの保存が2段階に分かれる理由
1.1.4 ストレージに記録するための様々な手法
1.1.5 この本のロードマップ
1.2 知っておいて欲しい事
1.2.1 統合開発環境のXcode
1.2.2 サンプルのプロジェクトについて
1.2.3 Objective-C言語
1.2.4 クイックヘルプ
1.2.5 いくつかの取り決め
1.3 参考になるApple開発者向けドキュメント
1.3.1 本書を読む前に読んでおきたい参考ドキュメント
1.3.2 本書を補完するドキュメント
1.3.3 この本の内容について書かれたドキュメント
2 主役はモデルオブジェクト
MVCと呼ばれるiOSアプリケーションのオブジェクト構成と主な連携方法の紹介
2.1 コンピュータは仮想世界
2.1.1 仮の世界に見立てた遊びとは
2.1.2 モデルオブジェクト
2.1.3 ビューオブジェクト
2.1.4 コントローラオブジェクト
2.1.5 MVC
2.2 オブジェクト間の連携
2.2.1 デリゲートデザインパターン
2.2.2 ターゲットアクションデザインパターン
2.3 MVCの特性
2.3.1 ビューの差し替え
2.3.2 再利用性に優れるMVC
2.3.3 モデルの拡張
2.3.4 コントローラの変更を伴うモデルの拡張
2.4 モデルの永続性
2.4.1 NSUserDefaultsによる値の永続性
3 もぐら叩きゲームを作ろう
永続性実験用アプリの準備と標準Cライブラリによるファイル操作
3.1 モグラを叩け!
3.1.1 ゲームの概要
3.1.2 ゲームの使い方
3.1.3 クラス構成
3.1.4 実装デザイン
3.1.5 MBMolehillView
3.1.6 MBMolehill
3.1.7 MBAppDelegate
3.1.8 モグラの穴を贅沢な表示にする
3.1.9 ゲームレベルの追加
3.2 レベル設定に永続性を持たせる
3.2.1 1つの値を1つのファイルに残してみる
3.2.2 ファイルの名前と位置
3.2.3 利用できるディレクトリのパス文字列の取り出し
3.2.4 fopenでファイルの準備
3.2.5 fwriteでファイルへ書き込む
3.2.6 fcloseでファイル操作の後始末をする
3.2.7 書き出されたファイルを探す
3.2.8 hexdumpでファイルの中身をのぞいてみる
3.2.9 デバッガでメモリの中身をのぞいてみる
3.2.10 freadでファイルから読みこむ
3.2.11 ストレージへの記録とは何か?
4 ゲームの成績表を残そう
ファイルフォーマット、バージョン管理、そしてオブジェクトを使ったファイル操作
4.1 成績ファイル
4.1.1 成績管理モデルの追加
4.1.2 fwriteを繰り返す
4.1.3 freadを繰り返す
4.1.4 fseekで読み込み位置を移動させる
4.2 ファイルフォーマット
4.2.1 記録数の追加
4.2.2 バージョン
4.2.3 ファイルの可搬性
4.2.4 そのファイルは何を表現したものか
4.2.5 マジックナンバー
4.3 成績ファイルのバージョンアップ
4.3.1 成績ファイル バージョン1
4.3.2 removeで不要なファイルを削除する
4.3.3 記録数の更新
4.3.4 バイナリファイル
4.3.5 成績ファイルフォーマット仕様書
4.3.6 ビット
4.3.7 符号
4.3.8 エンディアン
4.3.9 バイト境界
4.3.10 バイナリファイルで考慮する点
4.3.11 テキストファイル
4.3.12 CSVファイル
4.3.13 バイナリファイル v.s. テキストファイル
4.4 成績ファイルにオブジェクトを記録するには
4.4.1 NSCodingプロトコル
4.4.2 NSKeyedArchiverとNSKeyedUnarchiver
4.4.3 NSArrayやNSDictionaryの利用
4.4.4 例外ハンドラ:例外の受け取り処理
4.4.5 NSUserDefaultsの正体
4.4.6 NSPropertyListSerialization
4.4.7 NSUserDefaultsの値を設定アプリで調整
4.4.8 NSUserDefaultsの使いどころ
4.5 成績ファイルをXMLファイルとして書き出す
4.5.1 XMLファイル
4.5.2 NSDictionaryを使ったXMLファイル書き出し
4.5.3 オブジェクトのファイルへの読み書きまとめ
5 DBMSを利用したファイル操作
複数の生徒の成績を残すには
5.1 生徒の名簿
5.1.1 生徒名簿モデルの追加
5.1.2 生徒名関連のビュー群の追加
5.1.3 成績表のバージョンアップ
5.2 直接的な記録と関係付けた記録
5.2.1 関係付けされていない2つの表
5.2.2 関係付けされた2つの表
5.2.3 関係付けた表のメリット・デメリット
5.3 表+関係=データベース(DBMS)
5.3.1 DBMSで使われるSQL
5.3.2 テーブル・レコード・カラム
5.3.3 スキーマ
5.3.4 SQL文
5.4 実践SQLite
5.4.1 ターミナル上でのSQLite実践
5.4.2 SQLite用ファイルの作成
5.4.3 成績テーブルの作成(create)
5.4.4 成績テーブルにレコードを追加(insert)
5.4.5 レコードの取り出し(select,where,order by)
5.4.6 カラムの追加(alter table…add column)
5.4.7 レコードの更新(update)
5.4.8 レコードの削除(delete)
5.4.9 レコードの取り出し(like)
5.4.10 レコードの集計(sum,count,avg)
5.4.11 テーブルの削除(drop,vacuum)
5.5 データベースの設計 ?テーブルの関係付け?
5.5.1 正規化
5.5.2 ER図
5.5.3 1対多の関係
5.5.4 1対1の関係
5.5.5 多対多の関係
5.6 ER図を反映させたデータベース
5.6.1 テーブル作成(プライマリキー指定)
5.6.2 primary key制約
5.6.3 sqlite3での実践
5.6.4 テーブルを合成して値を取り出す
6 SQLiteをアプリに組み込もう
実験用アプリケーションへのDBMSの組み込みと機能拡張の説明、そしてキー値監視、キー値コーディング
6.1 SQLiteライブラリをプロジェクトへ追加する
6.1.1 SQLiteを扱うオブジェクトの準備
6.1.2 SQLiteの扱い方
6.1.3 テーブルの作成
6.1.4 SQL文の実行
6.1.5 レコードの追加
6.1.6 XMLファイルからのコンバート作業
6.1.7 レコードの取り出し
6.1.8 成績レコードの追加時の注意点
6.2 モグラたたきゲームへ機能を追加する
6.2.1 UIViewControllerの導入
6.2.2 MBMainViewController
6.2.3 成績管理用のカスタムUIViewController群
6.2.4 MBAdminViewControllerのビュー群
6.2.5 MBItemsViewControllerのビュー群
6.2.6 MBRecordViewControllerのビュー群
6.2.7 ストーリーボードの導入
6.2.8 画面遷移およびモデルオブジェクトの受け渡し
6.2.9 教師名簿モデルの準備
6.2.10 教師名簿モデルのGUI上への反映
6.2.11 成績への担当者設定機能追加のためのMBRecordsの拡張
6.2.12 成績レコードの編集
6.2.13 成績レコードの削除
6.2.14 SQLite(DBMS)を導入する価値
6.2.15 Core Dataへと続く道
6.3 KVOを使った連携
6.3.1 値の変更を見張る
6.3.2 KVC(Key-Value Coding:キー値コーディング)
7 Core Dataフレームワークをアプリに組み込もう
実験用アプリケーションのDBMSからCore Dataへの差し替え
7.1 管理オブジェクト:NSManagedObject
7.1.1 ER図=モデルの情報
7.1.2 Xcodeに組みこまれたモデルエディタ
7.1.3 エンティティの追加
7.1.4 エンティティへの属性追加
7.1.5 エンティティ間の関係付け
7.2 Core Dataに管理されるモデルの利用
7.2.1 Core Dataモデルの追加
7.2.2 NSManagedObjectContext
7.2.3 ストアコーディネータ:NSPersistentStoreCoordinator
7.2.4 モデル情報:NSManagedObjectModel
7.2.5 モデル情報の読み込み
7.2.6 永続性保証に利用するストレージ記録機構の指定
7.2.7 永続ストア
7.2.8 作成されるSQLiteファイル
7.3 データのインポート
7.3.1 レコード情報からNSManagedObjectへ
7.3.2 NSManagedObjectの生成
7.3.3 NSManagedObjectへの値の設定
7.3.4 NSManagedObject間の関係付け(対1)
7.3.5 NSManagedObject間の関係付け(対多)
7.3.6 永続性の保証
7.4 NSManagedObjectの画面への反映
7.4.1 NSManagedObjectのフェッチ(取り出し)
7.4.2 NSManagedObjectの追加
7.4.3 成績ごとの値の変更や担当教師の取り扱い
7.4.4 NSManagedObjectの削除
8 Core Dataをより理解するために
Core Dataの主要オブジェクト群の紹介
8.1 NSManagedObjectとエンティティ
8.1.1 コマンドラインツールプロジェクトの準備
8.1.2 NSManagedObjectModelの作成
8.1.3 NSPersistentStoreCoordinatorの作成
8.1.4 NSManagedObjectContextの作成
8.1.5 NSManagedObjectの作成
8.1.6 永続性の保証
8.1.7 NSManagedObjectへのカテゴリ宣言を使ったアクセス
8.1.8 カテゴリ宣言の注意点
8.1.9 NSManagedObject派生クラス
8.1.10 エンティティの属性用アクセサメソッドの準備
8.1.11 カスタムクラスのエンティティの属性用プロパティ宣言
8.1.12 エンティティの属性用アクセサメソッドのオーバーライド時の注意点
8.2 NSManagedObject間の関係
8.2.1 Core Data Model Editorの利用
8.2.2 関係の一括設定
8.2.3 個別の関係の変更(一括設定の応用)
8.2.4 個別の関係の変更(関係設定用のアクセサメソッド)
8.2.5 個別の関係の変更(代理人の利用)
8.2.6 XcodeによるNSManagedObject派生クラスファイルの自動生成
8.2.7 NSManagedObject削除時の関係の調整:Delete Rule
8.2.8 関係数についての設定
8.2.9 関係の順序付け
8.2.10 一時的にするか
8.3 NSManagedObjectのフェッチの詳細
8.3.1 エンティティごとのフェッチ
8.3.2 フェッチ結果の並び順指定
8.3.3 フェッチ結果の範囲指定
8.3.4 フェッチの条件指定
8.3.5 NSPredicate
8.4 Fetched Propertie(フェッチ済みプロパティ)
8.4.1 フェッチ済みプロパティを使ったフェッチ処理記述の簡素化
8.4.2 フェッチ済みプロパティへのフェッチ条件の設定
8.5 属性値の制限
8.5.1 数値の制限
8.5.2 日付の制限
8.5.3 文字列の制限
8.5.4 検証のタイミング
8.5.5 一時的にするか
8.5.6 値が未設定のままでも保存を許可するか
8.5.7 索引指定
8.5.8 その他の設定
8.5.9 属性値の初期値を指定
9 NSManagedObjectのカスタマイズ
派生時の注意点、および属性の型の拡張方法と注意点
9.1 Undo(やり直し)
9.1.1 Undoを利用できるテストアプリケーション
9.2 NSManagedObjectからカスタムクラスへ
9.2.1 2種類あるNSManagedObjectの作成パターン
9.2.2 初期化時の判別
9.2.3 -awakeFromInsert
9.2.4 -awakeFromFetch
9.2.5 フォールティング
9.2.6 アクセサメソッドのオーバーライド
9.2.7 プリミティブアクセサメソッド
9.2.8 属性値を加工するメソッド
9.2.9 属性の変化の見張り
9.2.10 後片付け
9.3 属性の型の拡張
9.3.1 Transformable型
9.3.2 Transformable型非対応
9.3.3 Transformable型(カスタム変換装置使用)
9.3.4 Binary Data型
9.3.5 Undefined型+Transient
9.3.6 Undefined型+Transient(非オブジェクト)
9.3.7 非オブジェクトの-setNilValueForKey:対応
9.4 実用的なサンプルアプリでフォールティングを学ぶ
9.4.1 大サイズのオブジェクトを扱うテストアプリケーション
9.4.2 容量が必要な属性はエンティティを分ける
9.4.3 フォールトの発動を利用した遅延読み込み
9.4.4 強制的にフォールト化させる
9.4.5 SQLite永続ストア利用時のBinary Data型のオプション
9.4.6 複数の永続ストアにエンティティを分散する
10 図形アプリへのCore Dataの適用
エンティティの派生、モデルファイルのバージョンアップとそれに伴う永続ストア用ファイルのマイグレーション
10.1 モデル表現の幅を広げる
10.1.1 図形アプリケーションdraw
10.1.2 drawを構成するクラス
10.1.3 エンティティの派生・循環関係のモデリング
10.1.4 EDModel
10.1.5 派生元エンティティ指定でのフェッチ
10.1.6 ビューとモデルの連携
10.1.7 NSManagedObjectID
10.2 バージョン管理
10.2.1 Core Dataによるバージョン管理
10.2.2 モデルファイルの変更
10.2.3 新バージョンのモデルファイルの追加
10.2.4 Lightweightマイグレーション
10.2.5 属性名の変更
10.2.6 マッピングモデルを使ったマイグレーション
10.2.7 属性のマッピング
10.2.8 NSEntityMigrationPolicy
10.2.9 Three-Stage Migration
10.2.10 FUNCTION
10.3 巨大な永続ストアのマイグレーション
10.3.1 マイグレーションが必要かを事前チェック
10.3.2 アクティビティインジケータ
11 モグラたたきゲームの完成
NSFetchedResultsControllerを利用してフェッチした管理オブジェクト群とUITableViewを連携させる
11.1 生徒・日付別にまとめる
11.1.1 NSFetchedResultsController
11.1.2 NSFetchedResultsControllerのセクション指定
11.1.3 NSManagedObjectの追加・削除・変更に対応
11.1.4 生徒と日付の切り替え
11.1.5 キャッシュ
11.1.6 利用者を待たせない
11.2 モデルのバージョンアップ
11.2.1 バージョン2モデルファイル
11.2.2 バージョン1→2マッピングモデルファイル
11.3 モグラたたきゲームバージョンアップ実装
11.3.1 マイグレーションをどこに組み込むか
11.3.2 MBMigrationViewController
11.3.3 並び替え機能の追加
11.4 完成
補足
索引