您如何创建一组与具有特定属性的其他实体有关系的实体?在核心数据中

Posted

技术标签:

【中文标题】您如何创建一组与具有特定属性的其他实体有关系的实体?在核心数据中【英文标题】:How do you create a Set of Entities which all have Relations to other Entities with Specific Attributes? In Core Data 【发布时间】:2010-08-25 21:26:37 【问题描述】:

我有一个名为“Card”的核心数据实体,它与另一个实体“CardInfo”有关系“信息”。是一对多的关系:每张卡片可以有多个 CardInfo,但每个 CardInfo 只能有一张 Card。

CardInfo 实体只有两个字符串,“cardKey”和“cardValue”。目的是允许任意输入卡片的数据。比如说,你想知道一张牌是什么颜色。然后,您将 CardInfo 添加到每个 CardKey 为“color”且 cardValue 为“black”或“red”的 Card。

我的一般问题是:获得一组卡片的最佳方法是什么,其中每张卡片都有一个 CardInfo,其中 CardKey 和 CardValue 具有特定的值。例如:所有与 CardInfo cardKey='color' 和 cardValue='red' 有关系的卡片?理想情况下,我返回一个包含所有适当 Card * 对象的 NSSet。

【问题讨论】:

【参考方案1】:

不需要最后的循环。一个简单的 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"];

【讨论】:

返回一个实际需要的集合:return [NSSet setWithArray:[items valueForKeyPath:@"@distinctUnionOfObjects.card"]];谢谢!【参考方案2】:

这是我想出的答案,但两部分的过程对我来说似乎效率低下。我认为必须有一种更优雅的方式来使用键值或其他东西来做到这一点

-(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];

【讨论】:

以上是关于您如何创建一组与具有特定属性的其他实体有关系的实体?在核心数据中的主要内容,如果未能解决你的问题,请参考以下文章

插入具有多个 NSFetchedResultsController 的行

在子 NSManagedObjectContext 中创建与父实体有关系的实体

在 jhipster 中添加与现有实体有关系的实体

Coredata / SWIFT 获取有关系的记录

实体框架查询——加载数据优化

共享业务和数据访问实体的策略