我有一个名为“Card”的核心数据实体,它与另一个实体“CardInfo”有“info”关系。这是一对多关系:每张卡可以有多个CardInfos,但每张CardInfo只有一张卡。
CardInfo实体只有两个字符串,“cardKey”和“cardValue”。目的是允许任意输入卡片的数据。说,你想知道一张卡是什么颜色的。然后你为每张卡片添加了一张CardInfo,其中cardKey为“color”,cardValue为“black”或“red”。
我的一般问题是:获取卡片组的最佳方法是每张卡片都有CardInfo,其中CardKey和CardValue具有特定值。例如:与CardInfo cardKey ='color'和cardValue ='red'有关系的所有卡?理想情况下,我返回所有相应Card *对象的NSSet。
答案 0 :(得分:2)
不需要最后的循环。一个简单的KVC调用可以很好地清理它。
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"CardInfo" inManagedObjectContext:self.managedObjectContext]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"cardKey = %@ AND cardValue = %@", thisKey, thisValue]];
NSError *error = nil;
NSArray *items = [[self managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release], fetchRequest = nil;
NSAssert1(error == nil, @"Error fetching objects: %@\n%@", [error localizedDescription], [error userInfo]);
return [items valueForKeyPath:@"@distinctUnionOfObjects.card"];
答案 1 :(得分:0)
这是我想出的答案,但这个由两部分组成的过程对我来说似乎效率低下。我认为必须有更优雅的方法来使用键值或其他东西
-(NSSet *)cardsWithCardKey:(NSString *)thisKey cardValue:(NSString *)thisValue {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CardInfo"
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate
predicateWithFormat:@"(cardKey=%@) AND (cardValue=%@)",
thisKey,thisValue];
[fetchRequest setPredicate:predicate];
NSError *error;
NSArray *items = [self.managedObjectContext
executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
NSMutableSet *cardSet = [NSMutableSet setWithCapacity:[items count]];
for (int i = 0 ; i < [items count] ; i++) {
if ([[items objectAtIndex:i] card] != nil) {
[cardSet addObject:[[items objectAtIndex:i] card]];
}
}
return [NSSet setWithSet:cardSet];
}