【问题标题】:Predicate for Many-To-Many多对多谓词
【发布时间】:2012-01-17 23:59:39
【问题描述】:

试图围绕谓词和核心数据展开思考。我有一个看起来像这样的模型。

房子 > 房间(房子有很多房间)
Room > Fixtures(房间有很多灯具,很多灯具可以属于房间)
Fixtures > Fixture_Types (fixtures 有很多类型)

如果我有“House”并且我需要获取所有唯一的 Fixture_types 其中“room” == “kitchen”(或其他),我的谓词应该是什么样子。

谢谢!

【问题讨论】:

  • 一个灯具如何同时属于两个房间?
  • @MarkAdams - 将其视为可重复用于多个房间的固定装置。这是标准归一化。例如,考虑一个数据库,其中有一个 Employee 表和一个 Position 表。员工可以有多个职位,一个职位(例如会计)可以由多个员工担任。同样的逻辑也适用于 tweeznasty 的 Room-to-Fixtures 关系。
  • 我理解规范化,但我不明白Fixture 的单个实例如何同时属于两个房间。按照您的员工类比,多对多关系应该在RoomFixture_Types 之间,因为会计职位不是实际职位,由一个人占据,它是一种可以适用于多个人的类型。
  • 对不起,我只是以房间、固定装置和固定装置类型为例。不实际。因此,如果您可以将问题视为假设。假设我的模型是清单、模板、模板项、类别。 Where Checklist > Templates, Templates > Items, Items > Categories.

标签: objective-c ios core-data


【解决方案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]];

希望这对某人有所帮助,如果有更好的方法可以做到这一点,或者如果您对我是如何做到的有疑问,请告诉我。

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多