Core Data を使用して、ゲーム用の単純なロード/セーブ システムを構築しようとしています。
UIManagedDocument の保存、読み込み、作成は正常に機能します。savegame エンティティの属性値の設定と読み込みも正常に機能します。
問題は、これらの値にアクセスする方法がわからないため、アプリを終了するとこれらの値が失われることです。
(NSNumber *)currentIncome など、savegame エンティティ内に約 200 の属性がありますNSNumber *currentMoney, NSNumber *currentMonth
。単純に見えますよね? これらを関係のある属性にグループ化すると、おそらく 20 個ほどの属性になるでしょう。Core Data Programming Guide から収集したものから、保存した UIManagedDocument の値でエンティティを埋めるために、結果の配列を満たす述語で fetchrequest を実行する必要があります。
ここで最初の疑問が生じます。属性ごとに fetchrequest を実行する必要があるのでしょうか? これは、少数の属性しかない場合、または「対多」な関係がある場合に便利です。私の場合、これは非常に面倒に思えます。
ここで非常に重要なものが欠落している可能性がありますが、次のようなものが必要ですがload my UIManagedDocument and automatically fill my NSManagedModel with the one that was saved in the document's context
、見つかりません。
それが私の 2 番目の質問の出番です: CoreData と UIManagedDocument は、これに対する正しいアプローチでもありますか? 200 個の変数は NSUserDefaults には多すぎます。ただし、NSCoding を使用することは想像できます。後で iCloud セーブゲーム共有を組み込むことは間違いなくあり、UIManagedDocument と CoreData はこれに最適なように思えました。
解決済み: Core Data fetching コード全体を書き直しました (20 行を 10 行程度に減らしました)。述語なしでエンティティに対して fetchrequest を実行すると、明らかにエンティティ全体が返されます。(NSArray *)
fetchedResults が nil (データベースが空) になった場合、管理対象オブジェクト コンテキストに savegame エンティティの新しいインスタンスを挿入します。非 nil になった場合は、 a を実行するだけで(NSManagedObject *)saveGame = [fetchedResults lastObject]
、すべての値が正常にロードされます。