6

複数のアイテムを持つサブカテゴリを持つすべてのカテゴリを見つけるにはどうすればよいですか? 次のコードを使用していますが、「複数対多のキーはここでは許可されていません」というメッセージが表示されます。

サブクエリを使用する必要がありますか?

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Categories"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"];
[request setPredicate:predicate];

ヘルプ!:)

4

3 に答える 3

9

私の経験に基づいて、述語の書式文字列を変更する必要があります

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"];    

から

@"ANY subcategories.items > 0"

の中へ

@"subcategories.items.@count > 0"

ANY キーワードも同様に使用する必要があることに注意してください。そうしないと、間違った方法でプロパティを照会することになります。

于 2012-04-21T08:42:50.190 に答える
3

NSPredicateでは、subcategories.items.@count >0代わりに使用する必要があります。

Sorr、それはカテゴリ(サブカテゴリが1つ)が1つである場合にのみ機能します。

本当に、あなたがすべきことは、アイテムがないすべてのサブカテゴリを削除することだと思います。

touよりも、サブカテゴリがあるかどうかを確認するだけで、空ではないことを意味します。 subcategories.@count >0

于 2012-04-12T08:57:24.203 に答える
2

SQL バックエンドでは 1 対多の関係のみを使用できます。これで解決しますが、「バックリンク」を順序付きセットに追加する必要があります(並べ替えを使用する場合に順序を維持するため、および同じカテゴリを指す複数のサブカテゴリを取得する可能性があるため、一意性を維持するため)。制限を考えると、理想的ではありませんが、悪くはありません。

// Search for all subcategories with item count > 0
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Subcategory"];
request.predicate = [NSPredicate predicateWithFormat:@"items.@count > 0"];
NSError *error = nil;
// They should have an inverse relationship to their category...
// We have to iterate and insert them in to a set, but there is no additional
// disk access.
NSMutableOrderedSet *results = [NSMutableOrderedSet orderedSet];
[[self.projectDatabase.managedObjectContext executeFetchRequest:request error:&error] enumerateObjectsUsingBlock:^(Subcategory *obj, NSUInteger idx, BOOL *stop) {
    [results addObject:obj.category];
}];

編集

残念ながら、これは SQL ストアでは不可能だと思います。最初に強調しておきますが、私は SQL の専門家に近いわけではなく、通常、これらの種類のクエリが不要になるように CoreData ストアを設計しようとしています。ただし、次の SUBQUERY は InMemory ストアで動作するため、ある程度適切にフォーマットされたサブクエリです。

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(subcategories, $s, $s.items.@count > 0).@count > 0"];

ただし、その述語は、SQL ストアを使用するとエラーになります。ドキュメントには、SQL ストアで述語を使用する場合にかなりの数の制限があると書かれているため、私は驚かないし、これを調査するのに多くの時間を費やす傾向もありません。

KVC 集合体が含まれていてはならない場所にあるキーパス。$s.items.@count の処理に失敗しました

于 2012-04-14T14:58:02.357 に答える