1

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]、すべての値が正常にロードされます。

4

1 に答える 1

0

データベースの観点からは、ここにあるのはsaveGame200 列の単一のテーブルを持つデータベースのようcurrentMoney, currentMonthに思えます。データベースには、現在のゲームの状態を表す単一の行があります。

これNSFetchRequestはデータベースSELECTステートメントと同等であり、1行しかないため、述語句などは実際には必要ありません。WHEREこのテーブルからすべてを取得するだけです。これは、エンティティのみを指定するフェッチリクエストが行っていることSELECT * FROM saveGameです.

全体として、コア データ フレームワークから多くの価値を得ているようには思えません。別の方法としてiCloud Key-Value storage API、現在コアデータから取得しているものに近いと思われる を調べることもできます。

于 2012-07-06T12:45:17.750 に答える