0

1 対多の関係で接続されている 2 つのエンティティがあります。たとえば、CategoryEntityItemEntityです。この関係は、CategoryEntity ではオプションですが (アイテムのないカテゴリが存在する場合もあります)、すべての ItemEntity で必須です。アプリの読み込み時に、カテゴリは既にストアに存在するため、ItemEntities をインポートして適切な CategoryEntity に接続したいと考えています。

各 ItemEntity に対して FetchRequest を実行して一致するカテゴリを見つけることは、毎回約 4000 ~ 6000 個のアイテムがあるため、明らかに良い解決策ではありません..

それで、もっと効率的にできることはありますか?

4

2 に答える 2

2

Core Data モデルを正しく設定すると、Category エンティティから Item エンティティへの対多関係と、Item から Category への逆対一関係が確立されます。また、対多関係には「カスケード」削除ルール、対一関係には「無効化」削除ルールがあります。

これを仮定すると、Item オブジェクトを挿入するたびに、Category 関係を設定すると、対応する Category に Item が自動的に挿入されます。アイテムを削除すると、対応するカテゴリから自動的に削除されます。

カテゴリ側では、カテゴリを削除すると、対応するすべてのアイテム オブジェクトが自動的に削除されます。

したがって、Items を取得すると、各 Item オブジェクトに対応する Category オブジェクトが既に取得されています。他に何もする必要はありません。デフォルトでは、フェッチ中に実際に Category オブジェクトを取得していないことに注意してください。代わりに、オブジェクトに最初にアクセスしようとしたときにエラーが発生し、その時点でオブジェクトが取得されます。フェッチしたばかりの Item オブジェクト内に格納されている Category オブジェクトをすぐに使用する予定がない場合、これによりパフォーマンスが向上します。Item をフェッチするたびに Category オブジェクトを使用する場合は、NSFetchRequest メソッドを使用する必要があります。

- (void)setReturnsObjectsAsFaults:(BOOL)yesNo
- (void)setRelationshipKeyPathsForPrefetching:(NSArray *)keys

フォールトが必要であり、Category 関係のプリフェッチを要求することを Core Data に伝えます。

于 2009-09-12T11:29:52.313 に答える
0

「インポート」アイテム エンティティとは、どういう意味ですか? これらは別の Core Data ストアにあり、どこかのファイルで別の形式で定義されており、ネットワーク経由で取得されていますか?

1 つの方法は、すべてのカテゴリを一度にフェッチし、それらをキャッシュとして機能する NSDictionary に追加し、迅速なルックアップを実行できる識別値によってキーを設定することです。インポート中にインスタンス化するアイテム エンティティごとに (その意味が何であれ)、そのカテゴリ ID を取得してから、キャッシュからカテゴリ MO を取得します。関係を設定して保存します。さらに良いことに、多数の挿入をまとめて、10、100、または 1000 ごとに保存して、IO オーバーヘッドを削減します。

于 2011-10-02T13:52:38.767 に答える