试图绕过谓词和核心数据。我有一个看起来像这样的模型。
House< - >>房间(房子有很多房间)
房<< - >>固定装置(房间有许多固定装置,许多固定装置可以属于房间)
固定装置< - >> Fixture_Types(灯具有很多种类型)
如果我有“House”,我的谓词应该是什么样的,我需要获得所有独特的Fixture_types,其中“room”==“kitchen”(或其他)。
谢谢!
答案 0 :(得分:1)
我想我明白了。这就是我做的。
获得顶级对象House及其儿童房 - 厨房。
Room *room = [house.rooms objectAtIndex:someIndex];
我有一个显示顺序,所以设置:
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"displayOrder" ascending:YES];
我有一个辅助函数来获取具有已定义谓词的对象,所以:
+(NSArray *)objectsForEntityNamed:(NSString *)name withPredicate:(NSPredicate *)predicate inContext:(NSManagedObjectContext *)context{
NSEntityDescription *entity = [NSEntityDescription entityForName:name inManagedObjectContext:context];
NSFetchRequest *req = [[NSFetchRequest alloc] init];
[req setEntity:entity];
[req setPredicate:predicate];
NSError *error = nil;
NSArray *array = [context executeFetchRequest:req error:&error];
if (array == nil){
NSException *exception = [NSException exceptionWithName:CoreDataExeption reason:[error localizedDescription] userInfo:nil];
[exception raise];
}
return array;
}
现在,对于好东西,谓词中的fixture_types是Fixture_Types与Fixtures的反向关系。当然,你可以做一个独特的但是因为我的数据库是规范化的,所以我应该只获得独特的结果:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY fixture_types IN %@", room.fixtures];
NSArray *fixture_types = [[CDUtilities objectsForEntityNamed:@"Fixture_Types" withPredicate:pred inContext:[house managedObjectContext]] sortedArrayUsingDescriptors:[[NSArray alloc] initWithObjects:descriptor, nil]];
希望这有助于某人,让我知道是否有更好的方法来做到这一点,或者如果你对我是如何做到这一点有疑问。