magazine.gif 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 完成

補足
索引