1

次のようなコアデータ構造があります。

+-------+-----+---------+
| uid   | id  | category
+-------+-----+---------+
| 12345 |  1  | 1
| 23456 |  1  | 1
| 34567 |  2  | 1
| 45678 |  2  | 2
| 56789 |  2  | 2
+-------+-----+---------+

一意の ID/カテゴリの組み合わせで NSManagedObjects (辞書ではない) が返されるようにデータをクエリすることは可能ですか? 上記のサンプル テーブルを使用して、23456 (id-1 カテゴリ 1 の最大 uid)、34567 (id-2 カテゴリ 1 の最大 uid)、56789 ( id-2 カテゴリ 2 の最大 uid)

生の SQL を使用すると、次のようにしてこれを行うことができます。

SELECT MAX(uid), id, category FROM TABLE GROUP BY id, category

上記の SQL を NSFetchRequest に変換することは可能ですか?

4

1 に答える 1

0

他の回答 (Martin R が指摘したものなど) に照らして、これを 2 つの部分に分けました。最初に、NSDictionaryResultType でフェッチ リクエストを使用して、すべての最大 uid を取得します。

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:context];
[request setEntity:entity];

NSExpression *expr = [NSExpression expressionForKeyPath:@"uid"];
NSExpression *maxExpr = [NSExpression expressionForFunction:@"max:" arguments:@[expr]];
NSExpressionDescription *exprDesc = [[NSExpressionDescription alloc] init];
[exprDesc setExpression:maxExpr];
[exprDesc setName:@"uid"];

NSPropertyDescription *id = [[entity propertiesByName] objectForKey:@"id"];
NSPropertyDescription *cat = [[entity propertiesByName] objectForKey:@"category"];

[request setPropertiesToGroupBy:[NSArray arrayWithObjects:id, cat, nil]];
[request setPropertiesToFetch:[NSArray arrayWithObjects:exprDesc, nil]];
[request setResultType:NSDictionaryResultType];

NSArray *result = [context executeFetchRequest:request error:nil];
NSArray *maxUids = [result valueForKeyPath:@"uid"];

次に、maxUids 配列を使用して、次の述語を使用して対応する NSManagedObjects をフェッチします。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(uid IN %@)", maxUids];

2 つのフェッチ リクエストを使用することは理想的とは言えませんが、SUBQUERY を使用したり、基になるデータ モデルを変更したりする代わりの方法を提供します。

于 2013-03-29T03:43:13.603 に答える