1

次の構造のデータベーステーブルをEntity模倣CoreDataするシングルがあります。MySQL

Photo
    abv            Double
    photoId        Integer16
    photographer   String
    isActive       Boolean
    lastUpdated    Data
    name           String

次のSQLステートメントを実行して、目的の結果セットを取得できます。

SELECT  `photographerName`, COUNT(`photographerName`) 
FROM  `Photos` 
WHERE  `isActive` LIKE 1
GROUP BY  `photographerName` 
ORDER BY  `photographerName` 

、、、のどの組み合わせNSFetchRequestを使用してNSSortDescriptor、同じ結果NSPredicateNSExpressionDescription得ることができiOSますか?

私は以下を使用しています:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Photo"];
NSSortDescriptor *photographerSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"photographer" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
NSPredicate *onlyActivePhotos = [NSPredicate predicateWithFormat:@"isActive == 1"];

request.sortDescriptors = @[photographerSortDescriptor];
request.predicate = onlyActivePhotos;

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];

これで問題はありませんが、ではなくisActive、すべての行が返されます。PhotoPhotographer

または...これを2つに分割する必要がありEntitiesますか?たとえば、?Photographerと1対多の関係があります。Photos

4

1 に答える 1

1

第一に、関係を持つことは確かにより良く、より柔軟な設計ですPhoto- Photographer

しかし、あなたが望むことも達成することができます。写真エンティティのみを取得できるため、結果の配列をフィルタリングして、写真家の名前を返す必要があります。

NSArray *photographerNames = [fetchedResultsController.fetchedObjects
   valueForKeyPath:"@photographer"];
NSSet *uniqueNames = [NSSet setWithArray:photographerNames];
NSArray *orderedNames = [uniqueNames sortedArrayUsingDescriptors:
   @[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]]]; 

ご覧のとおり、これは非常に面倒です。また、どの写真が各写真家に関連付けられているかという情報を失いました。

だから、関係を持って行ってください。結局のところ、Core Dataはオブジェクトグラフであり、データベースラッパーではありません。

于 2012-12-20T10:11:08.843 に答える