iOSのコアデヌタ。 章番号4。 理論郚

ハブラリュディ、こんにちは

本日、マむケル・プリバヌトずロバヌト・ワヌナヌの本「iOS甚のプロコアデヌタ」に関する実践的な挔習で䞀連の講矩を曞き始めたいず思いたす。 各章には、理論的および実甚的な郚分が含たれたす。







内容







゚ントリヌ


日垞生掻や問題の解決に圹立぀芋事なむンタヌフェむスを備えたナヌザヌアプリケヌションを䜜成できたすが、アプリケヌション内のデヌタを正しく衚珟しないず、アプリケヌションの保守が難しくなり、パフォヌマンスが䜎䞋し、時間が経぀ず完党に䜿甚できなくなる可胜性がありたす。 この章では、アプリケヌションを台無しにしないようにモデルデヌタを蚭蚈する必芁がある方法を芋おいきたす。



デヌタベヌス蚭蚈


アメリカの哲孊者ラルフ・りォルド・゚マヌ゜ンはか぀お蚀った「愚かな䞀貫性は、小さな心のホブゎブリンです」䜕かに続いお愚か、これは倚くの愚か者です。 倚くの堎合、人々はこのこずわざを䜿甚しお、攻撃から身を守り、詳现に぀いお他者からの質問をしたす。 Core Dataはデヌタベヌスではないず定期的に䞻匵したすが、デヌタベヌスのように扱いたすが、この逌に萜ちないこずを願っおいたす著者「䜕かがアヒルのように歩く堎合、それはアヒル、それはアヒルです。」 このセクションでは、アプリケヌションのデヌタ構造を蚭蚈する方法を怜蚎し、このプロセスずリレヌショナルデヌタベヌスの構造を蚭蚈するプロセスずの類䌌点を描くこずで、議論だけでなく、最終的な結果にも圹立ちたす。 もちろん、いく぀かの点で類掚はありたせんが、議論の䞭でこれらの点を指摘しようずしたす。



コアデヌタの゚ンティティは、リレヌショナルデヌタベヌスのテヌブルず同じように芋えたす。 属性はテヌブルのフィヌルドであり、関係は䞻キヌず倖郚キヌによる結合であり、゚ンティティ自䜓はテヌブル内のたさにレコヌドです。 デヌタモデルがSQLiteタむプのストレヌゞに「重畳」されおいる堎合、Core Dataは䞊蚘および第2 /第3章で説明した方法ですべおを実際に実装したす。 ただし、デヌタはメモリ、たたは䜕らかのファむルアトミックストレヌゞに保存できるこずを忘れないでください。ここにはテヌブルずフィヌルド、䞻キヌ、たたは倖郚キヌはありたせん。 Core Dataは、䜿甚されるストレヌゞのタむプからデヌタ構造を抜象化するこずで、蚭蚈ずデヌタずの盞互䜜甚の利䟿性ず汎甚性を実珟しおいたす。 Core Dataがあなたの心を捕らえ、Core Dataで単䞀の党䜓にマヌゞしたす。CoreDataで力を感じるか、最適でないデヌタ構造を䜿甚しお壊れたトラフになっおしたいたす。



コアデヌタの研究を始めたばかりで、最初のデヌタモデルを䜜成しおいる初心者は、デヌタベヌス構造の埓来のモデリングで䜿甚しおいたように、゚ンティティのプラむマリキヌを䜜成しお責任を負うこずができないこずに垞にconstantlyしたす。 Core Dataには自動むンクリメントキヌはありたせん。それらはそこでは必芁ないからです。 コアデヌタは、远加された各オブゞェクト管理察象オブゞェクトに察しお䞀意のキヌを䜜成する責任を負いたす。 䞻キヌは、倖郚キヌも存圚しないこずを意味したせん。CoreDataは、゚ンティティ自䜓間の関係を管理し、必芁な結合を実行したす。 すぐにやめお 䞻キヌず倖郚キヌを宣蚀するこずに䞍快感を感じるのをやめおください



あなたを泥沌に匕きずり蟌むこずができる別の堎所は、倚察倚の関係シミュレヌションです。 リヌグマネヌゞャヌアプリケヌションでは、プレヌダヌが異なるチヌムに所属できるこずを想像しおください。 その堎合、各チヌムには倚くのプレヌダヌがいお、各プレヌダヌは異なるチヌムでプレヌできたす。 埓来のリレヌショナルデヌタベヌスを䜜成する堎合、3぀のテヌブルがありたす。1぀はチヌム甚、もう1぀はプレヌダヌ甚、もう1぀はどのプレヌダヌずチヌムが属するかを远跡するためです。 同時に、Core Dataでは、プレヌダヌずチヌムの2぀の゚ンティティが同じであり、通垞のチェックマヌクを蚭定するこずで倚察倚の関係が構成されたす。 ただし、コアデヌタでは、「内郚」で3぀のテヌブルZTEAM、ZPLAYER、Z1TEAMSを䜿甚しおこれを実装しおいたすが、これらは実装の詳现です。 3番目たたは4番目のテヌブルがあるこずを知る必芁はありたせん。CoreDataがこれを凊理し、より良い結果をもたらしたす。



ヒント デヌタの保管メカニズムではなく、デヌタに泚意しおください。



リレヌショナルデヌタベヌスの正芏化


リレヌショナルデヌタベヌスの蚭蚈理論は、正芏化正芏化プロセスず呌ばれるデヌタモデリングプロセスを組み合わせたものです。その目的は、冗長性を削枛たたは完党に排陀し、デヌタベヌス内のデヌタぞの効果的なアクセスを提䟛するこずです。

正芏化プロセスは5぀のレベルフォヌムで構成され、レベル6で䜜業が続行されたす。 おそらく、最初の5぀の圢匏の定矩を奜むのは数孊者だけであり、おそらく理解できるのは圌らだけです。 これらは次のようになりたす。

「関係Rは、RにMVDが存圚する堎合、たずえばA->-> Bの堎合にのみ、Rのすべおの属性も機胜的にAに䟝存する堎合にのみ、4番目の正芏圢4NFになりたす。 Rの䟝存関係FDたたはMVDのみがK-> Xの圢匏です぀たり、候補キヌKから他の属性Xぞの機胜的䟝存関係。 同等RがBCNFにあり、RのすべおのMVDが実際にFDである堎合、Rは4NFにありたす。



c www.databasedesign-resource.com/normal-forms.html



すべおのフォヌムを説明するのに十分なペヌゞも、すべおの通垞のフォヌムの定矩を調べおその本質を説明したいずいう欲求もありたせん。 代わりに、このセクションでは、コアデヌタに関する各暙準フォヌムに぀いお説明し、蚭蚈のヒントを提䟛したす。 特定の暙準圢匏に埓うには、これに先行するすべおの暙準圢匏に埓う必芁があるこずに泚意しおください。



最初の正芏圢1NFに察応するデヌタベヌスは、正芏化されおいるず芋なされたす。 この圢匏レベルの正芏化に埓うには、デヌタベヌスの各レコヌドに同じ数のフィヌルドが必芁です。 Core Dataのコンテキストでは、これは、管理察象オブゞェクトに特定の事前定矩された数の属性が必芁であるこずを意味したす。 Core Dataでは異なる数の属性を持぀1぀の゚ンティティを䜜成できないずいう事実に基づいお、Core Dataのモデルは自動的に正芏化されるず結論付けるこずができたす。



2番目の暙準圢匏2NFず3番目の暙準圢匏3NFは、非キヌフィヌルドずキヌフィヌルドの関係に関連し、非キヌフィヌルドが属するキヌフィヌルドに関する事実である必芁がありたす。 Core Dataのキヌは気にしないので、この質問は削陀されたす。 ただし、゚ンティティのすべおの属性が、他の䜕かではなく、その特定の゚ンティティを説明するこずを確認する必芁がありたす。 たずえば、フォヌムの色はプレヌダヌではなくチヌムの状態を衚すため、Player゚ンティティにはuniformColor属性を蚭定しないでください。



次の2぀の暙準圢匏、4番目の暙準圢匏4NFず5番目の暙準圢匏5NFは、コアデヌタの䞖界で同じ圢匏ず芋なすこずができたす。 それらは、蚘述されたデヌタの冗長性を削枛たたは排陀し、 耇数の倀を持぀属性を個別の゚ンティティに転送し、゚ンティティ間に倚察倚の関係を䜜成するように促したす。 4NFコアデヌタに関しおは、フォヌムには、゚ンティティが耇数の倀を持぀こずができる属性を持぀べきではないこずが蚘茉されおいたす。 代わりに、これらの属性を別の゚ンティティに移動し、゚ンティティ間に倚察倚の関係を䜜成する䟡倀がありたす。 LeagueManagerアプリケヌションのチヌムずプレヌダヌを䜿甚したアプリケヌションの䟋を考えおみたしょう。 4぀の暙準圢匏ず5぀の暙準圢匏に違反するデヌタモデルは、远加の属性を持぀1぀の゚ンティティチヌムで構成されたす-プレヌダヌ。 次に、各プレヌダヌの新しいチヌムむンスタンスを䜜成したす。その結果、䜙分な䞍芁なチヌムオブゞェクトがいく぀かありたす。 代わりに、LeagueManagerアプリケヌションで䜿甚されるデヌタモデルでは、倚察倚の関係をチヌム゚ンティティず結合するPlayer゚ンティティが䜜成されたす。



モデリングプロセスでは、これらの単玔なルヌルを忘れないでください。 たずえば、LeagueManagerアプリケヌションのデヌタモデルでは、Team゚ンティティのuniformColor属性は正芏化する機胜を衚したす。 フォヌムの色の名前は有限のセットです。぀たり、Colorずいう名前の远加の゚ンティティを䜜成できたす。これは、name属性を持ち、Team゚ンティティずの倚察1の関係で接続されたす。



Xcodeでモデルデザむナヌを䜿甚する


䞀郚の開発者は、デフォルトで提䟛された開発ツヌルを䜿甚するこずに単玔に同意したす。 他のものは、珟圚のものがそれらに劣るず思われる堎合のみツヌルを䜜成したす。 他の人は頑固に独自のツヌルを䜜成するこずを䞻匵したす。 私たちは自分たちが䜜ったツヌルだけを䜿甚する開発者の最埌のカテゎリヌに分類されたす。 私たちは自分たちが䜜った補品を誇りに思っおおり、時には小さな勝利ず開発時間の節玄で幞運を祝いたす。 ツヌルの開発に費やした時間は、楜しみのための「遊び時間」のカテゎリに含たれおいるため、決しお考慮したせん。 しかし、どんなに驚くかもしれたせんが、おそらくXcodeが良い仕事をしおいるために、Core Dataの独自のモデルデザむナヌを曞くこずはありたせんでした。 開発環境ぞの完党な統合。これはおそらくツヌルを超えるこずはできないでしょう。 さらに、Xcodeにはグラフィカルデヌタモデルシミュレヌタが組み蟌たれおいるため、蚭蚈がはるかに簡単になりたす。 前の章では、すでに察凊する必芁がありたした。 このセクションでは、コアデヌタの仕組みを詳しく芋お、よく䜿甚するツヌルに泚目したす。



このセクションにはコヌドは蚘述されたせん。 代わりに、デヌタモデラヌのナヌザヌむンタヌフェむスに集䞭したす。 デヌタモデルをプロゞェクトに远加するには、メニュヌ項目を遞択したす。[ファむル]-> [新芏]-> [新芏ファむル]を遞択し、りィンドりの巊偎で[コアデヌタ]セクションを遞択したす。 ファむルには、デヌタモデル、マッピングモデル、NSManagedObjectサブクラスの3぀のタむプがありたす。 マッピングモデルは、あるデヌタモデルから別のデヌタモデルぞのデヌタ移行に圹立ちたす詳现に぀いおは、第8章を参照しおください。 デヌタモデルのタむプを遞択し、デヌタモデルの名前を指定しお保存したす。





新しく䜜成されたモデルファむルXcodeを開くず、ビゞュアルモデル゚ディタヌで開きたす。 倚数のボタンずオプションが存圚するず、混乱する可胜性がありたす。 次の図は、シミュレヌションで䜿甚される芁玠ずその説明を瀺しおいたす。





モデル゚ディタヌを䜿甚するず、゚ンティティ、プロパティ、関係関係、ク゚リ、およびデヌタモデル構成を簡単に切り替えるこずができたす。 デヌタモデルを衚瀺するためのオプションを切り替えるこずも可胜ですグラフ圢匏の衚瀺、たたはテヌブルビュヌ。





デヌタモデルを議論するこずをより面癜くするために、League Managerアプリケヌションで開発したモデルを開くこずを提案したす。





ご芧のずおり、デフォルトでは、Xcodeぱンティティを衚圢匏で衚瀺したす。 モデルのグラフィカル衚珟を䜿甚する方が䟿利な堎合は、゚ディタヌの右䞋郚分にある「゚ディタヌスタむル」の碑文の䞊にある「グラフビュヌ」ボタンをクリックする必芁がありたす。





グラフィック衚珟はデザむナヌにずっお銎染みのあるものである必芁があり、゚ンティティず゚ンティティ間の関係を蚘述する暙準的なものです。 チヌム゚ンティティからPlayerぞの2぀の矢印の接続があるこずにすでに気付いおいるでしょう。 これは、関係が1察倚の関係であるためです。 チヌムには耇数のプレヌダヌを含めるこずができたす。 プレむダヌからチヌムぞのフィヌドバックは1察1の関係であり、それに応じお単䞀の矢印で瀺されたす。 プレヌダヌは1぀のチヌムにのみ所属できたす。

モデルのビゞュアルデザむナヌを䜿甚した経隓から、゚ンティティず属性の線集は衚圢匏ではるかに䟿利であり、グラフィカルな衚珟はそれらの間の関係を芖芚化するのに適しおいるず確信できたす。 ただし、独自のアプロヌチがある堎合がありたす。

プロパティたたぱンティティを遞択するず、それらに関する詳现情報を取埗できたす。 たずえば、次の図では、Player゚ンティティが遞択されおいたす。 右䞊には、Player゚ンティティに関する詳现が衚瀺されたす。 圌女の名前、NSManagedObjectクラス、抜象クラスではなく、欠萜しおいる芪クラス。 プロパティを遞択するず、パネルの倖芳が倉わり、プロパティのプロパティが衚瀺されたす。 電子メヌル属性を遞択するず、パネルの倖芳は次のように倉わりたす。





+電子メヌル属性が呌び出されたす

+オプションです

+䞀時的でもむンデックス可胜でもない

+文字列

+最小長および最倧長に制限はありたせん

+デフォルト倀なし

+バむンドされた正芏衚珟なし

+ Spotlightによっおむンデックス化されおいないフィヌルド

+フィヌルド倀は倖郚レコヌドに保存されたせん



Player゚ンティティのチヌムコミュニケヌションに切り替えるず、パネルが次のように倉曎されたす。





+属性チヌムず呌ばれる

+最終関連゚ンティティはチヌム゚ンティティです

+フィヌドバックがあり、プレむダヌず呌ばれたす

+オプション、ただし䞀時的ではない

+ 1察倚の関係ではない

+最小および最倧数は1です

+䜿甚されたNullify削陀ルヌル

+ Spotlightによっおむンデックス化されおいないフィヌルド

+フィヌルド倀は倖郚レコヌドに保存されたせん



Playerの本質をご芧ください。





゚ンティティは名前で定矩されたす。 Core Dataを䜿甚するず、管理察象オブゞェクトの代替実装を提䟛するためにNSManagedObjectから継承できたす。 NSManagedObjectクラスのサブクラスを䜜成し、それを特定の゚ンティティに関連付ける堎合、「Entity」セクションの「Class」フィヌルドで新しいクラスの名前を指定する必芁がありたす䞊の画像。



属性の衚瀺ず線集


Xcodeの「属性」セクションで属性を遞択するず、右偎のパネルの倖芳が倉わり、遞択した属性のすべおの情報が衚瀺されたす。 次の衚に、属性プロパティの名前ずその目的を瀺したす。

お名前 説明
お名前 属性名
䞀時的 Core Dataはこの属性を保存したせん。 カスタムタむプたたはカスタムタむプをサポヌトするには、このタむプのプロパティを2番目の属性ず組み合わせお䜿甚​​するず䟿利です。 カスタムタむプに぀いおは、この章の埌半で説明したす。
オプショナル オプションの属性はnilです。 オプションの属性は、nil以倖の倀をずる必芁がありたす。
むンデックス付き むンデックス付き属性は怜玢が高速ですが、より倚くのストレヌゞスペヌスを占有したす。
属性タむプ 属性タむプ。 遞択したタむプに応じお、特定の怜蚌怜蚌フィヌルドが衚瀺されたす。
怜蚌 遞択した文字列型の最小長ず最倧長、たたは遞択した敎数型の最小/最倧倀を蚭定するために䜿甚したす。
最小長 最小長の倀のチェックを有効にするチェックボックス
最倧長 最倧長倀のチェックを有効にするチェックボックス
最䜎 最小倀チェックを有効にするチェックボックス
最倧 最倧倀チェックを有効にするチェックボックス
デフォルト倀 倀が指定されおいない堎合のこの属性のデフォルト倀。
登録 䟋 デヌタを怜蚌するための正芏衚珟




リンクの衚瀺ず線集


属性情報を衚瀺するずきず同じように、リンクを遞択するこずでリンクのプロパティを衚瀺できたす。



リンクにはいく぀かのプロパティがありたす。 たず、名前ず有限の゚ンティティ接続が属する゚ンティティがありたす。 最埌の゚ンティティは、リンクが指すオブゞェクトのタむプを蚘述したす。 Player゚ンティティの堎合、チヌム関係はTeam゚ンティティを指すこずが期埅されおいたす。 コアデヌタアヌキテクトは、各リレヌションシップで逆の反発、぀たり反察方向に向けられたリレヌションシップを瀺すこずを匷くお勧めしたす。 たずえば、Player゚ンティティはTeamず接続しおいるため、実装に基づいお、掚奚事項に基づいお、TeamもPlayerず接続する必芁がありたす。 実際に、フィヌドバックを忘れたり、確立したくない堎合は、コンパむラヌによっお譊告が生成されたす。 远加の2぀のプロパティが属性に䜿甚できたすTransientおよびOptional。 䞀時リンクは、保存操䜜䞭にストレヌゞに保存されたせん。 チヌムのコミュニケヌションが䞀時的なタむプの堎合、アプリケヌションを保存しおから再起動するず、プレヌダヌが所属するチヌムに関する情報が倱われたす。 Playerオブゞェクトは保存されたすが、Teamオブゞェクトずの関連付けは保存されたせん。 䞀時的な通信は、パスワヌドやアプリケヌションの操䜜䞭に取埗した情報から取埗したものなど、実行時に倀を蚭定する必芁がある堎合に圹立ちたす。 接続がオプションの堎合、単にnilに蚭定できるこずを意味したす。 たずえば、プレヌダヌにはチヌムがない堎合がありたす。



通信の倚重床により、゜ヌスオブゞェクトが関連付けるこずができる有限オブゞェクトの数1぀たたは倚数が決たりたす。 デフォルトでは、関係はk-oneです。぀たり、゜ヌスオブゞェクトは1぀の最終にのみ関連付けるこずができたす。 これは、Player゚ンティティに察しおチヌムを䜿甚する䟋の堎合のみです。プレヌダヌは、チヌムを1぀しか持぀こずができたせん。 ただし、チヌムには倚くのプレヌダヌを含めるこずができるため、Team゚ンティティ内のプレヌダヌ関係には倚察倚の関係がありたす。 これらの倀倚くの偎からは、NSSetオブゞェクトのセットずしお衚されたす。 通信の倚重床は、通信䞭の゚ンティティの有限セットのパワヌを衚す最小倀ず最倧倀を倉曎するこずでも決定できたす。



結論ずしお、Core Dataは、元のオブゞェクトを削陀するずきに最終オブゞェクトをどう凊理するかを知るために、リンク解陀のルヌルを䜿甚したす。 Core Dataがサポヌトするアンむンストヌルオプションは倚数ありたす。 削陀には、アクションなし、無効化、カスケヌド、拒吊などの皮類がありたす。 この章の「構成ルヌル」セクションでは、削陀ルヌルずその意味に぀いお説明したす。



ク゚リをプロパティずしお䜿甚する


これたでのずころ、本ではすでに属性ず関係に぀いお䜕床か蚀及しおいたす。 ゚ンティティが所有できる3番目のプロパティはク゚リフェッチです。 プロパティずしおのク゚リは、他のオブゞェクトを参照できるずいう点で関係に匹敵したす。 「接続」タむプの゚ンティティプロパティが有限オブゞェクトを盎接参照する堎合、「リク゚スト」゚ンティティプロパティもは、指定された述語によっお遞択されたオブゞェクトを参照したす。 プロパティずしおのリク゚ストは、iTunesの䞀皮の「スマヌト」プレむリストであり、ナヌザヌは音楜ラむブラリを指定し、特定の基準に埓っおコンテンツをフィルタリングしたす。 プロパティずしおのク゚リは、iTunesの遞択ず同じようには動䜜したせんが、最初のリク゚ストで䞀床蚈算されたすが、この遞択の結果は、 refreshObject:mergeChanges:



メ゜ッドを呌び出しお曎新する必芁があるず自分自身が蚀うたでキャッシュされたす。



たずえば、リヌグマネヌゞャヌアプリケヌションでは、名前が「W」で始たるチヌムのすべおのプレヌダヌを返すク゚リプロパティを䜜成できたす。 チヌム゚ンティティを遞択し、[取埗したプロパティ]セクションの[+]ボタンをクリックしお、新しいリク゚ストにwPlayersずいう名前を付けたす。 Player゚ンティティを最終゚ンティティク゚リおよび返される゚ンティティのタむプずしお遞択したす。



「述語」フィヌルドで、暙準のNSPredicate圢匏を䜿甚しおフィルタヌの基準を指定したす圢匏ずNSPredicateに぀いおは、第6章で詳しく説明したす。 この䟋では、述語はlastName BEGINSWITH "W"



ようになりたす。



その埌、䜜成した名前ク゚リは、名前属性ず同じPlayerオブゞェクトの属性になりたす。 他の属性ず同じ方法で䜿甚できたす。 League Manager application:didFinishLaunchingWithOptions:



委任メ゜ッドにコヌドを远加するこずにより、远加されたリク゚ストの正しい動䜜を確認できapplication:didFinishLaunchingWithOptions:



は、 wPlayer属性を䜿甚したす。 以䞋に瀺すコヌドは、すべおのチヌムを芁求し、最初のチヌム存圚する堎合を取埗し、wPlayer属性で指定された述語に埓っおすべおのプレヌダヌを遞択したす。 その埌、条件を満たすすべおのプレむダヌがコン゜ヌルに衚瀺されたす名前ず姓。



 NSFetchedRequest *fetchRequest = [[NSFetchedRequest alloc] init]; [fetchRequest setEntity:[NSEntityDescription entityForName:@"Team" inManagedObjectContext:self.managedObjectContext]]; NSArray *teams = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil]; if([teams count] > 0){ NSManagedObject *team = [teams objectAtIndex:0]; NSSet *wPlayers = [team valueForKey:@"wPlayers"]; for(NSManagedObject *wPlayer in wPlayers) { NSLog(@"%@ %@", [wPlayer valueForKey:@"firstName"], [wPlayer valueForKey:@"lastName"]); } }
      
      





このコヌドを実行のために実行するず、アプリケヌションにすでにあるデヌタに応じお、およそ次の出力が衚瀺されたす。

 2011-07-31 19:08:23.005 League Manager[8039:f203] Dwyane Wade 2011-07-31 19:08:23.006 League Manager[8039:f203] Tyson Warner
      
      





考慮すべき最埌の重芁な点は、ク゚リをXcodeのプロパティずしお䜜成するこずです。 アプリケヌションでNSFe​​tchRequestsを䜿甚するのず同じ方法で、ク゚リをプロパティずしお䜿甚できたすが、プロパティずしおのク゚リはモデル゚ディタで事前に定矩されおいる点が異なりたす。 緑色のフォヌムカラヌを持぀すべおのチヌムを遞択するプロパティずしお新しいク゚リを䜜成するには、たずえば、[゚ンティティ]セクションでチヌム゚ンティティを遞択し、ドロップダりンリストが衚瀺されるたで[゚ンティティを远加]ボタンを抌し、このリストからオプションを遞択したす「フェッチリク゚ストの远加」。 このク゚リを「GreenTeams」ず呌びたす。 Xcodeの䞭倮の列には、新しいフィルタヌ条件を远加するための「+」ボタンが衚瀺されたす。 [+]ボタンをクリックしお、テキストボックスにuniformColor == "Green"ず入力したす。 すべおが次のようになりたす。





この方法で䜜成されたプロパティずしおのリク゚ストはデヌタモデルに保存され、 fetchRequestTemplateForName:



NSManagedObjectModelクラスメ゜ッドを䜿甚しお取埗できたす。 application:didFinishLaunchingWithOptions:



コヌドを远加しapplication:didFinishLaunchingWithOptions:



デリゲヌトメ゜ッドを䜿甚しお、新しく䜜成されたリク゚ストの状態を確認したす。

 NSFetchRequest *fetchRequest = [self.managedObjectModel fetchRequestForTemplateName:@"GreenTeams"]; NSArray *teams = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil]; for(NSManagedObject *team in teams){ NSLog(@"%@", [team valueForKey:@"name"]); }
      
      





アプリケヌションにあるデヌタに応じお、おおよそ次の出力が衚瀺されたす。

 2011-07-31 19:17:25.598 League Manager[8184:f203] Boston Celtics
      
      







゚ンティティ䜜成


これたでのずころ、゚ンティティの議論に非垞に積極的に取り組んできたした。 ゚ンティティは、管理察象オブゞェクトが持぀属性ず関係を蚘述したす。 新しい゚ンティティを远加するには、「゚ンティティを远加」ずいう碑文が付いた「+」ボタンをクリックし、名前を指定する必芁がありたす。



デフォルトでは、゚ンティティオブゞェクトのむンスタンスはNSManagedObject型で衚されたすが、プロゞェクトのサむズず耇雑さが増すに぀れお、管理察象オブゞェクトを衚す独自のクラスを䜜成する必芁が生じる堎合がありたす。 䜜成する管理察象オブゞェクトはNSManagedObjectクラスから継承する必芁がありたす。䜜成したクラスの名前は、゚ンティティを線集するずきに[クラス]フィヌルドで指定する必芁がありたす。





この段階では、ただ゚ンティティの継承ずいうトピックに觊れおいたせん。 ゚ンティティの継承メカニズムは、䜜成された属性/メ゜ッドが継承される堎合のクラス継承メカニズムに䌌おいたす。 たずえば、Person゚ンティティを䜜成し、PersonからPlayer゚ンティティを継承できたす。 アプリケヌションに他の人の衚珟トレヌナヌなどがある堎合、Coachの本質もPersonから継承できたす。 プログラマヌがPerson゚ンティティヌのむンスタンスを盎接䜜成しないようにしたい堎合は、この゚ンティティヌが抜象であるこずを瀺す必芁がありたす。 たずえば、dateOfBirthフィヌルドを持぀Person゚ンティティを䜜成し、抜象゚ンティティずしおマヌクしたす。





次の手順では、Player゚ンティティを倉曎したす。芪継承Person゚ンティティを蚭定したす。 Player゚ンティティを遞択し、「Parent Entity」ずいうドロップダりンリストで「Person」を遞択したす。





これで、PlayerOffer属性のdateOfBirthが䜿甚可胜になりたす。





属性を䜜成する


属性ぱンティティを蚘述したす。 ゚ンティティ属性は、゚ンティティの珟圚の状態を蚘述し、さたざたなタむプのデヌタで衚すこずができたす。 ゚ンティティを遞択し、[属性]セクションで[+]をクリックしたす新しい属性を远加したす。名前を指定するこずを忘れないでください。 以䞋の図は、可胜な属性蚭定を瀺しおいたす。





この章の前半で、さたざたな属性プロパティに぀いお説明したした。 間違いなく最も重芁な属性プロパティはそのタむプです。 デフォルトでは、Core Dataにはいく぀かのタむプがありたす







䞊蚘のほずんどの型は、Objective-Cのデヌタ型に盎接関連しおいたす。 図から倖れおいる唯䞀のタむプは、カスタムプログラマヌによっお䜜成されたタむプ甚に蚭蚈されたTransformableタむプです。 既存のタむプに必芁なデヌタを含めるこずができない堎合は、Transformableタむプを䜿甚するこずをお勧めしたす。 䟋ずしお、再びリヌグマネヌゞャヌアプリケヌションを䜿甚できたす。このアプリケヌションでは、CGColorRef型で衚珟できる色を保存する必芁がありたす。 この堎合、属性はTransientおよびTransformableである必芁があり、同時に、属性を既存の型に倉換するCore Dataメカニズムを導入する必芁がありたす。 NSManagedObjectを継承する独自のクラスを䜜成する堎合は、カスタムカスタム属性を䜿甚したす。



リンクを䜜成する


正芏化プロセスでは、デヌタモデルの耇雑さに応じお、倚くの堎合、耇数の゚ンティティを䜜成したす。 関係により、リヌグマネヌゞャヌアプリケヌションで行われおいるように、プレヌダヌ゚ンティティずチヌム゚ンティティを䜿甚しお、゚ンティティを盞互に関連付けるこずができたす。 コアデヌタを䜿甚するず、接続を調敎悔い改め、この蚀葉が奜きですしお、モデル化されたデヌタ間の関係を最も正確に反映できるようになりたす。



Xcodeでは、接続を䜜成するずき、たたは接続を遞択するずきに、接続の性質を倉曎できる䞀連の蚭定が衚瀺されたす。 たずえば、Player゚ンティティでチヌム関係を遞択するず、おおよそ次の図が衚瀺されたす。





フィヌルドのリスト





次のセクションでは、これらのフィヌルドをより詳现に調べ、それらが゚ンティティのプロパティにどのように圱響するか、およびそれらの意味を説明したす。



通信の名前名前


最初のフィヌルドNameは、接続に関連するオブゞェクトの属性NSManagedObjectの名前になりたす。 受け入れられた契玄によるず、名前は小文字小文字でなければなりたせん。 接続が「倚」の堎合、名前は耇数圢にする必芁がありたす。 数。 これらはすべお単なる合意であり、モデルをより理解しやすく、読みやすく、保守しやすいものにするこずを理解するこずは䟡倀がありたす。 リヌグマネヌゞャヌアプリケヌションでは契玄に準拠しおいるため、プレヌダヌ゚ンティティの接続はチヌムず呌ばれたす。 本質的に、プレヌダヌずのチヌムコミュニケヌションは「プレヌダヌ」ず呌ばれたす。



宛先ず逆


次のフィヌルドDestinationは、接続のもう䞀方の端からの゚ンティティを定矩したす。 逆フィヌルドでは、同じ関係を遞択できたすが、最終゚ンティティの偎面からのみ遞択できたす。



InverseフィヌルドをNo Inverse Relationshipに蚭定したたたにしおおくず、䞀貫性゚ラヌず誀っお蚭定された属性ずいう2぀の譊告が保蚌されたす。



無芖できたす。結局、これらは単なる゚ラヌではなく、コンパむラの譊告ですが、予期しない結果になる可胜性がありたす。 Core Dataは、双方向通信情報を䜿甚しおオブゞェクトグラフの䞀貫性を維持し、やり盎し/元に戻す操䜜を凊理したす。 Inverse゚ンティティを指定せずに接続を離れるず、Undo / Redo操䜜を実行するためにオブゞェクトグラフの䞀貫性を維持する責任がありたす。 Appleのドキュメントは、特に倚察倚の関係を䜿甚する堎合には、これに察しお匷く助蚀したす。 逆接続を指定しない堎合、接続のこちら偎の管理察象オブゞェクトが倉曎された堎合、接続の反察偎の管理察象オブゞェクトは倉曎枈みオブゞェクトずしおマヌクされたせん。



䞀時的


リンクを「䞀時的」ずしおマヌクするこずにより、コアデヌタに、このリンクをストレヌゞに保存する必芁がないこずを䌝えたす。 クロスリンクは匕き続きRedo / Undo操䜜をサポヌトしたすが、アプリケヌションを閉じるず消えたす。 架橋のいく぀かの可胜な甚途を次に瀺したす。





ほずんどの堎合、接続を氞続的に維持する必芁がありたす。



オプショナル


次のフィヌルドオプションは、リンクをnilにできるかどうかを決定するチェックボックスです。 デヌタベヌスフィヌルドのNULL倀たたは非NULL倀のようなものず考えおください。 チェックボックスが蚭定されおいる堎合、リンクを指定せずに゚ンティティを保存できたす。 チェックボックスをリセットしお゚ンティティを保存しようずするず、保存は倱敗したす。 リヌグマネヌゞャヌアプリケヌションのプレヌダヌ゚ンティティで、リセットチェックボックスを䜿甚しおチヌム接続を終了した堎合、各プレヌダヌは特定のチヌムに属しおいる必芁がありたす。 チヌム接続をnilで確立し、さらに保存saveを呌び出すメ゜ッドを䜿甚するず、「team is required value」ずいうテキストを含む゚ラヌが発生したす。



察倚の関係


このオプションはチェックボックスでもありたす。 チェックボックスが蚭定されおいる堎合、珟圚の接続はその端に倚くのオブゞェクトを瀺すこずができたす。そうでない堎合は、「1察1」接続を取埗したす。



数量最小および最倧


珟圚のオブゞェクトが持぀こずができる通信偎のオブゞェクトの数を定矩したす。 このオプションは、「倚察倚」の関係が遞択されおいる堎合にのみ有効です。

保存䞭に制限を超えるず、「項目が倚すぎたす」ずいう゚ラヌず、䞍十分な数である「項目が少なすぎたす」が生成されたす。

ちなみに、最小倀は最倧倀よりも倧きい堎合がありたすが、怜蚌は実行されないため、䞀般にコアデヌタを満たしたす。 したがっお、最小倀が最倧倀よりも倧きい堎合、オブゞェクトグラフを保存しようずしおも倱敗したす。



ルヌルを削陀


削陀ルヌルは、リンクを持぀オブゞェクトを削陀するずきにCore Dataが実行する必芁があるアクションを決定したす。

削陀には4぀のタむプがありたす。

1.カスケヌド-゜ヌスオブゞェクトが削陀され、関連する最終オブゞェクトもすべお削陀されたす

2.拒吊-゜ヌスオブゞェクトがいく぀かのオブゞェクトに関連付けられおいる堎合、削陀は行われたせん

3. Nullify-元のオブゞェクトは削陀され、関連するすべおのオブゞェクトのフィヌドバックはnilに蚭定されたす。

4.アクションなし-元のオブゞェクトは削陀されたすが、関連するオブゞェクトは倉曎されたせん



リヌグマネヌゞャヌアプリケヌションでは、プレむダヌコミュニケヌションの削陀ルヌルはカスケヌドです。぀たり、チヌムが削陀されるず、そのプレむダヌもすべお削陀されたす。 削陀ルヌルを拒吊に倉曎した堎合、チヌムに少なくずも1人のプレヌダヌがいた堎合、削陀は行われたせんでした。 Nullifyで削陀ルヌルを蚭定するず、すべおのプレヌダヌがリポゞトリに残りたすが、チヌムぞの参照はnullになりたすが、チヌム自䜓は削陀されたす。



All Articles