1

CoreDataを使用して実行したい次のSQLクエリがあります。

SELECT t1.date, t1.amount + SUM(t2.amount) AS importantvalue
FROM specifictable AS t1, specifictable AS t2
WHERE t1.amount < 0 AND t2.amount < 0 AND t1.date IS NOT NULL AND t2.date IS NULL
GROUP BY t1.date, t1.amount;

現在、CoreDataフェッチリクエストは単一のエンティティからのみフェッチできるようです。このクエリ全体を単一のフェッチリクエストで実行する方法はありますか?

4

2 に答える 2

1

私が知っている最善の方法は、一緒に取得したいエンティティの抽象的な親エンティティを作成することです。

したがって、「肉」、「野菜」、および「果物」エンティティがある場合、「食品」の親抽象エンティティを作成し、「食品」エンティティ内のすべての甘いエンティティを取得できます。このようにして、甘い「肉」「野菜」「果物」をすべて手に入れることができます。

こちらをご覧ください: Apple ドキュメントのエンティティの継承。

于 2012-12-29T13:17:22.957 に答える
1

ニコライ

Core Data は SQL システムではありません。より原始的なクエリ言語を備えています。これは赤字のように見えますが、実際にはそうではありません。物事をRAMに取り込み、DBではなくRAMで複雑な計算を行う必要があります. NSSet/NSMutableSet 操作は非常に高速で効果的です。これにより、アプリの速度も向上します。(これは、フラッシュが遅い iOS で特に顕著であり、したがって、大きなフェッチが優先されます。)

あなたの質問への回答として、はい、フェッチ リクエストは単一のエンティティで動作します。いいえ、そのエンティティのデータに限定されません。1 つはキー パスを使用して、述語言語で関係をトラバースします。

Shannoga の答えは、問題を解決する 1 つの良い方法です。しかし、エンティティの継承を使用することがアプリにとって正しい道であるかどうかを判断するために、データ モデルで実際に何を達成しようとしているのかについて十分に知りません。そうではないかもしれません。

サーバーからの SQL スキーマは、CD アプリでは意味をなさない場合があります。クエリ言語と UI でのデータの使用方法の両方によって、おそらく異なる構造が強制されます。(たとえば、iOS でフェッチされた結果コントローラーを使用すると、サーバー上とは異なる方法でデータを非正規化する必要があります。)

エンティティの継承は、OOP での継承と同様、堅固なテクノロジです。変更するのは難しいです。ですので、大切に使っています。実際に使用すると、一部のフェッチでパフォーマンスが向上し、他の計算でいくらか単純化されます。それ以外の場合は、パフォーマンスに関しては間違った答えです。

本当の答えは質問です。あなたは本当に何をしようとしていますか?

アンドリュー

于 2012-12-30T12:49:37.420 に答える