Getting Started with Core Data Tutorial

これは、Swift4.2とiOS12用に完全に更新された、私たちの本Core Data by Tutorialsの要約された章です。 このチュートリアルは、私たちのiOSの一部として提示されています12打ち上げパーティー—お楽しみください!

コアデータへようこそ!

このチュートリアルでは、最初のCore Dataアプリを作成します。 スターターコードテンプレートからデータモデルエディタまで、Xcodeで提供されているすべてのリソースを簡単に使い始めることができます。

あなたは最初から右に走って地面を打つつもりです。 チュートリアルの終わりまでに、次の方法を知っています:

  • Xcodeのモデルエディタを使用したモデルデータ
  • Core Dataに新しいレコードを追加
  • Core Dataからレコードセットを取得
  • テーブルビューを使用して取得したレコー

また、コアデータが舞台裏で何をしているのか、そして様々な動く部分とどのように対話することができるのかを知ることができます。

はじめに

Xcodeを開き、シングルビューアプリテンプレートに基づいて新しいiOSプロジェクトを作成します。 アプリのヒットリストに名前を付け、”Core Dataを使用”がチェックされていることを確認します。

Use Core Dataボックスをオンにすると、XcodeはAppDelegateのNSPersistentContainerとして知られている定型コードを生成します。スウィフト

NSPersistentContainerは、コアデータからの情報の保存と取得を容易にするオブジェクトのセットで構成されています。 このコンテナ内には、コアデータの状態を全体として管理するオブジェクト、データモデルを表すオブジェクトなどがあります。

標準スタックはほとんどのアプリでうまく機能しますが、アプリとそのデータ要件に応じて、スタックをより効率的にカスタマイズできます。

: IOS▸Applicationの下のすべてのXcodeテンプレートにCore Dataで開始するオプションがあるわけではありません。 Xcode10では、マスター詳細アプリとシングルビューアプリテンプレートのみがコアデータを使用チェックボックスを持っています。

このサンプルアプリのアイデアは簡単です:あなた自身の”ヒットリスト”の名前のリストを持つテーブルビューがあります。 このリストに名前を追加し、最終的にはCore Dataを使用してデータがセッション間で保存されていることを確認できます。 私たちは、このサイト上で暴力を容認しないので、あなたはもちろん、あまりにもあなたの友人を追跡するためのお気に入りリストとして、このアプリ

メインをクリックします。それをInterface Builderで開くためのstoryboard。 キャンバス上のview controllerを選択し、navigation controller内に埋め込みます。 Xcodeのエディタメニューから、Embed In…▸Navigation Controllerを選択します。

ナビゲーションコントローラのナビゲーションバーをクリックして選択し、属性インスペクタで大きなタイトルを優先します。 これにより、サンプルアプリにAppleのstockアプリに一致するタイトルスタイルが提供されます。

次に、オブジェクトライブラリからview controllerにテーブルビューをドラッグし、ビュー全体をカバーするようにサイズを変更します。

まだ開いていない場合は、キャンバスの左下隅にあるアイコンを使用してInterface Builderのドキュメントアウトラインを開きます。

Ctrlキーを押しながらドキュメントアウトラインのテーブルビューから親ビューにドラッグし、安全領域への先頭スペース制約を選択します:

これをさらに3回行い、スペースを安全領域に、上部スペースを安全領域に、最後に下部スペースを安全領域に選択します。 これらの4つの制約を追加すると、テーブルビューがその親ビューを埋めるようになります。

次に、バーボタン項目をドラッグし、view controllerのナビゲーションバーに配置します。 最後に、バーボタン項目を選択し、そのシステム項目を追加するように変更します。

キャンバスは次のスクリーンショットのようになります:

追加ボタンをタップするたびに、テキストフィールドを含むアラートコントローラが表示されます。 そこから、テキストフィールドに誰かの名前を入力することができます。 Saveをタップすると、名前が保存され、アラートコントローラが閉じられ、テーブルビューが更新され、入力したすべての名前が表示されます。

しかし、最初に、view controllerをテーブルビューのデータソースにする必要があります。 キャンバスで、以下に示すように、テーブルビューからナビゲーションバーの上の黄色のview controllerアイコンにCtrlキーを押しながらドラッグし、dataSourceをクリックします:

疑問に思っている場合は、セルをタップしてもアクションがトリガーされないため、テーブルビューのデリゲートを設定する必要はありません。 それはこれよりも簡単にはなりません!

Command-Option-Enterキーを押すか、Xcodeバーのエディタツールセットの中央のボタンを選択して、アシスタントエディタを開きます。

Ctrlキーを押しながらテーブルビューからViewControllerにドラッグします。swiftはクラス定義内でIBOutletを作成します。

次に、新しいIBOutletプロパティtableViewという名前を付け、次の行になります:

@IBOutlet weak var tableView: UITableView!

次に、Ctrlキーを押しながら追加ボタンからViewControllerにドラッグします。swiftはあなたのviewDidLoad()定義のすぐ下にあります。 今回は、出口の代わりにアクションを作成し、メソッドaddNameに型を指定しますUIBarButtonItem:

@IBAction func addName(_ sender: UIBarButtonItem) { }

これで、テーブルビューとバーボタン項目のアクションをコードで参照できるようになりました。

次に、テーブルビューのモデルを設定します。 ViewControllerに次のプロパティを追加します。以下のスウィフトtableView IBOutlet:

var names: = 

names テーブルビューによって表示される文字列値を保持する可変配列です。 次に、viewDidLoad()の実装を次のように置き換えます:

override func viewDidLoad() { super.viewDidLoad() title = "The List" tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")}

これにより、ナビゲーションバーにタイトルが設定され、UITableViewCellクラスがテーブルビューに登録されます。

注:register(_:forCellReuseIdentifier:)は、セルreuseIdentifierがdequeueメソッドに提供されたときに、テーブルビューが正しい型のセルを返すことを保証します。

次に、まだViewControllerにあります。swiftでは、クラス定義の下に次のUITableViewDataSource拡張子を追加しますViewController:

// MARK: - UITableViewDataSourceextension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return names.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = names return cell }}

あなたがUITableViewで作業したことがあるなら、このコードは非常によく知られているはずです。 最初に、テーブル内の行数をnames配列内の項目数として返します。

次に、tableView(_:cellForRowAt:)はテーブルビューのセルをデキューし、names配列の対応する文字列を入力します。

次に、テーブルビューがそれらを表示できるように新しい名前を追加する方法が必要です。 以前にコードにCtrl-ドラッグしたaddNameIBActionメソッドを実装します:

// Implement the addName IBAction@IBAction func addName(_ sender: UIBarButtonItem) { let alert = UIAlertController(title: "New Name", message: "Add a new name", preferredStyle: .alert) let saveAction = UIAlertAction(title: "Save", style: .default) { action in guard let textField = alert.textFields?.first, let nameToSave = textField.text else { return } self.names.append(nameToSave) self.tableView.reloadData() } let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) alert.addTextField() alert.addAction(saveAction) alert.addAction(cancelAction) present(alert, animated: true)}

追加ボタンをタップするたびに、このメソッドはテキストフィールドと2つのボタンを持つUIAlertControllerを表示します:保存とキャンセル。

Saveは、テキストフィールドの現在のテキストをnames配列に挿入し、テーブルビューを再ロードします。 names配列はテーブルビューを裏付けるモデルであるため、テキストフィールドに入力するものはすべてテーブルビューに表示されます。

最後に、アプリを初めてビルドして実行します。 次に、追加ボタンをタップします。 アラートコントローラは次のようになります:

リストに4つまたは5つの名前を追加します。 以下のようなものが表示されます:

テーブルビューにはデータが表示され、配列には名前が格納されますが、ここで欠けている大きなものは永続性です。 配列はメモリ内にありますが、アプリを強制終了したり、デバイスを再起動したりすると、ヒットリストは消去されます。 Core Dataは永続性を提供し、データをより耐久性のある状態で保存できるため、アプリの再起動やデバイスの再起動よりも長持ちします。

コアデータ要素はまだ追加されていないため、アプリから移動した後は何も保持されません。 これを試してみましょう。 物理デバイスを使用している場合はホームボタンを押し、シミュレータを使用している場合は同等のもの(Shift+⌘+H)を押します。 これにより、ホーム画面の使い慣れたアプリグリッドに戻ります:

ホーム画面から、ヒットリストのアイコンをタップして、アプリを前景に戻します。 名前はまだ画面に表示されます。 どうしました?

ホームボタンをタップすると、現在前景にあるアプリが背景に移動します。 これが発生すると、オペレーティングシステムは、names配列の文字列を含む、現在メモリ内のすべてをフラッシュフリーズします。 同様に、目を覚ましてフォアグラウンドに戻る時が来たとき、オペレーティングシステムは以前のメモリにあったものを、あなたが去ったことがないかのように復元します。

Appleはios4でマルチタスクのこれらの進歩を導入しました。 彼らはiOSユーザーのためのシームレスな体験を作成しますが、iOS開発者のための永続性の定義にしわを追加します。 名前は本当に永続化されていますか?

いいえ、そうではありません。 あなたは完全に高速アプリスイッチャーでアプリを殺したか、お使いの携帯電話をオフにしていた場合、それらの名前は消えてしまうだろう。 これも確認できます。 アプリをフォアグラウンドにして、fast app switcherを入力します。 これを行うには、デバイスにホームボタンがある場合はダブルタップするか、iPhone Xを使用している場合は画面の下からゆっくりと上にドラッグします。

ここから、ヒットリストアプリのスナップショットを上にフリックしてアプリを終了します。 IPhone Xで作業している場合は、右上に赤い削除ボタンが表示されるまでアプリのスナップショットを長押しする必要があります。

アプリスイッチャーからアプリを削除した後、生きているメモリにヒットリストの痕跡がないはずです(しゃれは意図されていません)。 ホーム画面に戻り、新しい起動をトリガするためにヒットリストアイコンをタップすることにより、名前がなくなっていることを確認します。

flash-freezingとpersistenceの違いは、iosをしばらく使用していて、マルチタスクの仕組みに精通している場合は明らかです。 しかし、ユーザーの心の中では違いはありません。 ユーザーは、アプリがバックグラウンドに入って戻ってきたのか、アプリがそれらを保存してリロードしたのか、名前がまだ存在する理由を気にしません。 重要なのは、アプリが戻ってくるときに名前がまだそこにあることです!

だから、永続性の本当のテストは、あなたのデータが新しいアプリの起動後にまだそこにあるかどうかです。

データのモデリング

永続性をチェックする方法がわかったので、コアデータに飛び込むことができます。 入力した名前をそのまま保持して、アプリを新しく起動した後に表示できるようにします。

これまで、名前をメモリに格納するために普通の古いSwift文字列を使用してきました。 このセクションでは、これらの文字列をCore Dataオブジェクトに置き換えます。

最初のステップは、コアデータがディスク上のデータを表す方法を記述するマネージオブジェクトモデルを作成することです。デフォルトでは、Core Dataは永続ストアとしてSQLiteデータベースを使用するため、データモデルをデータベーススキーマと考えることができます。

注:コアデータを扱うときには、managedという言葉にかなり出くわすでしょう。 NSManagedObjectContextのように、クラスの名前に”managed”と表示されている場合は、コアデータクラスを扱っている可能性があります。 「管理された」とは、Core DataオブジェクトのライフサイクルのCore Dataの管理を指します。

ただし、すべてのコアデータクラスに”managed”という単語が含まれていると仮定しないでください。 コアデータクラスの包括的なリストについては、ドキュメントブラウザのコアデータフレームワークリファレンスを参照してください。Core Dataを使用することを選択したため、Xcodeは自動的にデータモデルファイルを作成し、HitListという名前を付けました。xcdatamodeld.

ヒットリストを開きます。xcdatamodeld. ご覧のように、Xcodeには強力なデータモデルエディタがあります:

データモデルエディタには、後で調べることができる多くの機能があります。 ここでは、単一のコアデータエンティティの作成に焦点を当ててみましょう。

左下のエンティティの追加をクリックして、新しいエンティティを作成します。 次のように、新しいエンティティをダブルクリックして、その名前をPersonに変更します:

モデルエディタがEntity.という用語を使用する理由は、単に新しいクラスを定義していなかったのでしょうか? あなたはすぐに見るように、コアデータは、独自の語彙が付属しています。 ここでは、一般的に遭遇するいくつかの用語の簡単な概要です:

  • エンティティは、コアデータのクラス定義です。 典型的な例はEmployeeまたはCompanyです。 リレーショナルデータベースでは、エンティティはテーブルに対応します。
  • 属性は、特定のエンティティに添付された情報の一部です。 たとえば、Employeeエンティティは、従業員のnameposition、およびsalaryの属性を持つことができます。 データベースでは、属性はテーブル内の特定のフィールドに対応します。
  • リレーションシップは、複数のエンティティ間のリンクです。 コアデータでは、2つのエンティティ間のリレーションシップはto-oneリレーションシップと呼ばれ、1つのエンティティと多数のエンティティ間のリレーションシップはto-manyリレーションシップと呼ばれます。 たとえば、Managerは従業員のセットと多対多の関係を持つことができますが、個々のEmployeeは通常、彼のマネージャーと一対一の関係を持つことになります。
注:エンティティがクラスによく似ていることに気づいたでしょう。 同様に、属性と関係はプロパティによく似ています。 違いは何ですか? コアデータエンティティはクラス定義と考え、マネージオブジェクトはそのクラスのインスタンスと考えることができます。

今、あなたは属性が何であるかを知っている、あなたは以前に作成されたPersonオブジェクトに属性を追加することができます。 まだヒットリストにあります。xcdatamodeldで、左側のPersonを選択し、属性の下のプラス記号(+)をクリックします。

新しい属性のnameを,er,nameに設定し、その型をStringに変更します:

コアデータでは、属性は複数のデータ型のいずれかにすることができます。

コアデータへの保存

ViewControllerを開きます。swiftは、UIKitインポートの下に次のコアデータモジュールのインポートを追加します:

import CoreData

このインポートは、コードでCore Data APIの使用を開始するために必要なすべてです。

次に、namesプロパティ定義を次のように置き換えます:

var people: = 

文字列名ではなくPersonエンティティを格納するため、テーブルビューのデータモデルとして機能する配列の名前をpeopleに変更します。 単純な文字列ではなくNSManagedObjectのインスタンスを保持するようになりました。このオブジェクトを使用して、Core Data永続ストアの作成、編集、保存、削除を行う必要があります。 あなたがすぐに見るように、NSManagedObjectはシェイプシフターです。 これは、データモデル内の任意のエンティティの形式をとり、定義した属性と関係を適切にすることができます。

テーブルビューのモデルを変更しているので、以前に実装された両方のデータソースメソッドも置き換える必要があります。 UITableViewDataSource拡張子を次のように置き換えます:

// MARK: - UITableViewDataSourceextension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return people.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let person = people let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = person.value(forKeyPath: "name") as? String return cell }}

これらの方法に対する最も重要な変更は、tableView(_:cellForRowAt:)で発生します。 セルをモデル配列内の対応する文字列と一致させる代わりに、セルを対応するNSManagedObjectと一致させるようになりました。

NSManagedObjectからname属性を取得する方法に注意してください。 それはここで起こります:

cell.textLabel?.text = person.value(forKeyPath: "name") as? String

なぜこんなことをしなければならないのですか? 結局のところ、NSManagedObjectはデータモデルで定義したname属性について知らないため、プロパティを使用して直接アクセスする方法はありません。 コアデータが値を読み取るために提供する唯一の方法は、一般にKVCと呼ばれるキーと値のコーディングです。

注:Kvcは、文字列を使用してオブジェクトのプロパティに間接的にアクセスするためのFoundationのメカニズムです。 この場合、KVCはNSMangedObjectを実行時に辞書のように動作させます。

キーと値のコーディングは、NSObjectから継承するすべてのクラスで使用できます。NSManagedObjectを含みます。 NSObjectから派生していないSwiftオブジェクトでkvcを使用してプロパティにアクセスすることはできません。

次に、addName(_:)を見つけて、saveUIAlertActionを次のように置き換えます:

let saveAction = UIAlertAction(title: "Save", style: .default) { action in guard let textField = alert.textFields?.first, let nameToSave = textField.text else { return } self.save(name: nameToSave) self.tableView.reloadData()}

これにより、テキストフィールド内のテキストが取得され、save(name:)という名前の新しいメソッドに渡されます。 Xcodeはsave(name:)がまだ存在しないために文句を言います。 以下に追加しますaddName(_:):

func save(name: String) { guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } // 1 let managedContext = appDelegate.persistentContainer.viewContext // 2 let entity = NSEntityDescription.entity(forEntityName: "Person", in: managedContext)! let person = NSManagedObject(entity: entity, insertInto: managedContext) // 3 person.setValue(name, forKeyPath: "name") // 4 do { try managedContext.save() people.append(person) } catch let error as NSError { print("Could not save. \(error), \(error.userInfo)") }}

これがコアデータの始まりです! ここでは、コードが何をするかです:

  1. コアデータストアから何かを保存または取得する前に、まずNSManagedObjectContextを手に入れる必要があります。 マネージオブジェクトコンテキストは、マネージオブジェクトを操作するためのメモリ内の”スクラッチパッド”と見なすことができます。

    新しい管理対象オブジェクトをCore Dataに保存することは、まず、新しい管理対象オブジェクトを管理対象オブジェクトコンテキストに挿入します。

    Xcodeは、新しいプロジェクトのテンプレートの一部として管理対象オブジェクトコンテキストを既に生成しています。 これは、最初に[コアデータを使用]チェックボックスをオンにした場合にのみ発生します。 この既定のマネージオブジェクトコンテキストは、アプリケーションデリゲート内のNSPersistentContainerのプロパティとして存在します。 これにアクセスするには、まずアプリデリゲートへの参照を取得します。

  2. 新しい管理オブジェクトを作成し、管理オブジェクトコンテキストに挿入します。 これは、NSManagedObjectの静的メソッドentity(forEntityName:in:)を使用して1つのステップで行うことができます。

    あなたはNSEntityDescriptionがすべてに約あるか疑問に思うかもしれません。 以前、NSManagedObjectは、任意のエンティティを表すことができるため、shape-shifterクラスと呼ばれていました。 エンティティの説明は、実行時にデータモデルからのエンティティ定義をNSManagedObjectのインスタンスとリンクする部分です。

  1. NSManagedObjectを使用して、キーと値のコーディングを使用してname属性を設定します。 データモデルに表示されるとおりにKVCキー(この場合はname)を正確に綴る必要があります。
  2. 変更をpersonにコミットし、マネージオブジェクトコンテキストでsaveを呼び出してディスクに保存します。 注saveはエラーをスローする可能性があるため、do-catchブロック内でtryキーワードを使用して呼び出す必要があります。 最後に、新しい管理オブジェクトをpeople配列に挿入して、テーブルビューのリロード時に表示されるようにします。

これは文字列の配列を使用するよりも少し複雑ですが、それほど悪くはありません。 マネージオブジェクトコンテキストやエンティティの取得など、ここでのコードの一部は、独自のinit()またはviewDidLoad()で一度だけ実行してから、後で再利用できます。 簡単にするために、あなたは同じ方法でそれをすべてやっています。

アプリをビルドして実行し、テーブルビューにいくつかの名前を追加します:

名前が実際にCore Dataに格納されている場合、HitListアプリは永続性テストに合格する必要があります。 フォアグラウンドでアプリを使用して、高速アプリスイッチャーに移動し、それを終了します。

Springboardから、HitListアプリをタップして新しい起動をトリガーします。 待って何があったの? テーブルビューが空です:

Core Dataに保存しましたが、新しいアプリの起動後、people配列は空です! データがあなたを待っているディスク上に座っているが、あなたはまだそれを表示していないためです。

コアデータからのフェッチ

永続ストアからマネージオブジェクトコンテキストにデータを取得するには、それをフェッチする必要があります。 ViewControllerを開きます。swiftと以下を追加しますviewDidLoad():

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //1 guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } let managedContext = appDelegate.persistentContainer.viewContext //2 let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Person") //3 do { people = try managedContext.fetch(fetchRequest) } catch let error as NSError { print("Could not fetch. \(error), \(error.userInfo)") }}

ステップバイステップで、これはコードが何をするかです:

  1. コアデータを使用して何かを行う前に、管理対象オブジェクトコンテキストが必要です。 フェッチは違いはありません! 前と同様に、アプリケーションデリゲートをプルアップし、その永続コンテナへの参照を取得して、そのNSManagedObjectContextを手に入れます。
  2. 名前が示すように、NSFetchRequestはコアデータからのフェッチを担当するクラスです。 フェッチ要求は強力で柔軟性があります。 Fetch要求を使用して、指定された基準を満たすオブジェクトのセットをフェッチすることができます(つまり、 私にウィスコンシン州に住んでいるすべての従業員を与え、少なくとも三年会社とされている)、個々の値(すなわち、私にデータベース内の最長の名前を与え

    Fetch要求には、返される結果のセットを絞り込むために使用されるいくつかの修飾子があります。 今のところ、NSEntityDescriptionはこれらの必須修飾子の1つであることを知っておく必要があります。

    フェッチ要求のentityプロパティを設定するか、またはinit(entityName:)で初期化すると、特定のエンティティのすべてのオブジェクトがフェッチされます。 これは、すべてのPersonエンティティを取得するためにここで行うことです。 また、NSFetchRequestはジェネリック型です。 このジェネリックの使用は、フェッチ要求の期待される戻り値の型、この場合はNSManagedObjectを指定します。

  3. フェッチ要求をマネージオブジェクトコンテキストに渡して、重いリフティングを行います。 fetch(_:)は、fetch要求で指定された条件を満たす管理対象オブジェクトの配列を返します。
注:save()と同様に、fetch(_:)もエラーをスローする可能性があるため、doブロック内で使用する必要があります。 フェッチ中にエラーが発生した場合は、catchブロック内のエラーを検査し、適切に応答できます。

アプリケーションをビルドして実行します。 すぐに、以前に追加した名前のリストが表示されます:

すごい! 彼らは死者から戻ってきた(しゃれが意図した)。 リストにいくつかの名前を追加し、保存とフェッチが機能していることを確認するためにアプリを再起動します。 アプリを削除したり、シミュレータをリセットしたり、背の高い建物から携帯電話を投げたりすると、名前が何であってもテーブルビューに表示されます。

注:このサンプルアプリにはいくつかの粗いエッジがありました: 毎回アプリデリゲートからマネージオブジェクトコンテキストを取得する必要があり、KVCを使用して、より自然なオブジェクトスタイルperson.nameではなくエ

キーポイント

  • Core Dataはディスク上の永続性を提供するため、アプリを終了したり、デバイスをシャットダウンしたりしてもデータにアクセスできます。 これは、アプリがフォアグラウンドまたはバックグラウンドのいずれかでメモリ内にある限り、データを保存するメモリ内永続性とは異なります。
  • Xcodeには、マネージオブジェクトモデルを作成するために使用できる強力なデータモデルエディタが付属しています。
  • マネージオブジェクトモデルは、エンティティ、属性、および関係で構成されています
  • エンティティは、コアデータのクラス定義です。
  • 属性は、エンティティに添付された情報の一部です。
  • リレーションシップは、複数のエンティティ間のリンクです。
  • NSManagedObjectは、コアデータエンティティの実行時表現です。 キーと値のコーディングを使用して、その属性の読み取りと書き込みを行うことができます。
  • コアデータとの間にNSManagedObjectContextからsave()またはfetch(_:)データが必要です。

ここからどこへ行くのですか?

このチュートリアルの完成したプロジェクトは、このチュートリアルの上部または下部にある”材料のダウンロード”ボタンを使用してダウンロー

このチュートリアルでは、データモデル、エンティティ、属性、マネージオブジェクト、マネージオブジェクトコンテキスト、およびフェッチ要求など、いくつかの基本的なコアデータの概念をすでに経験しています。

あなたはこのチュートリアルで学んだことを楽しんだ場合は、なぜ私たちの店で利用可能なチュートリアルブックによって完全なコアデータをチ

ここに本の中にあるものの味があります:

1。 第1章、最初のCore Dataアプリ:File▸New Projectをクリックして、Core Dataアプリを最初から作成します! この章では、データモデルの設定とレコードの追加とフェッチの基本について説明します。

2. 第2章NSManagedObjectサブクラス:NSManagedObjectは、コアデータオブジェクトグラフの基本データストレージクラスです。 この章では、データを格納および検証するために独自のマネージオブジェクトサブクラスをカスタマイズする方法を説明します。

3. 第3章コアデータスタック:内部では、コアデータは多くの部分が連携して構成されています。 この章では、これらのパーツがどのように適合するかについて学び、スターター Xcodeテンプレートから離れて、独自のカスタマイズ可能なシステムを構築します。

4. 第4章中間フェッチ:アプリは常にデータをフェッチし、Core Dataはデータを効率的に取得するための多くのオプションを提供します。 この章では、より高度なフェッチ要求、述語、ソート、非同期フェッチについて説明します。

5. 第5章N Sfetchedresultscontroller:テーブルビューは多くのiOSアプリの中核にあり、AppleはCore Dataをそれらとうまく機能させたいと考えています! この章では、テーブルビューがCore Dataのデータによってバックアップされているときに、N Sfetchedresultscontrollerが時間とコードを節約する方法を学習します。

6. 第6章バージョン管理と移行:アプリを更新して強化すると、そのデータモデルはほぼ確実に変更する必要があります。 この章では、データモデルの複数のバージョンを作成し、アップグレード時に既存のデータを保持できるようにユーザーを前方に移行する方法を学習します。

7. 第7章単体テスト:テストは開発プロセスの重要な部分であり、コアデータをそこから離れるべきではありません! この章では、コアデータ用に別のテスト環境を設定する方法と、モデルをテストする方法の例を参照してください。

8. 第8章パフォーマンスの測定と向上: 誰もアプリが速すぎると不平を言ったことはないので、パフォーマンスの追跡に注意することが重要です。 この章では、さまざまなXcodeツールを使用してアプリのパフォーマンスを測定する方法を学び、コード内の遅いスポットに対処するためのヒントをいくつか

9. 第9章複数の管理対象オブジェクトコンテキスト:この最後の章では、通常のコアデータスタックを展開して、複数の管理対象オブジェクトコンテキスト これにより、知覚されるパフォーマンスがどのように改善され、アプリアーキテクチャがモノリシックでなく、より区画化され

そして、契約を甘くするのを助けるために、本のデジタル版は4 44.99で販売されています! しかし、待ってはいけない—この販売価格は限られた時間のためにのみ利用可能です。

甘いお得な情報といえば、私たちはプレゼントでover9,000以上を含む、iOS11打ち上げパーティーで今年配っている素晴らしい賞品をチェックしてください!

この壮大なiOS12プレゼントの対象となるためには、あなたがしなければならないすべては、私たちはこのリスト上であなたのお気に入りである本やコー

私たちは、あなたがこの更新を楽しむことを願って、より多くの本のリリースや更新をお楽しみに!

raywenderlich.com 週刊

raywenderlich.com ニュースレターは、あなたがモバイル開発者として知っておく必要があるすべてのものに最新の滞在する最も簡単な方法です。

私たちのチュートリアルやコースの毎週のダイジェストを取得し、ボーナスとして無料の詳細な電子メールコースを受け取ります!

平均評価

4.6/5

このコンテンツの評価を追加する

サインインして評価を追加する

56評価

コメントを残す

メールアドレスが公開されることはありません。