【问题标题】:Core Data NSFetchRequest for Specific Relationship?特定关系的核心数据 NSFetchRequest?
【发布时间】:2011-03-17 01:42:55
【问题描述】:

我正在将以前存储在 XML 中的现有数据模型转换为 Core Data,因此我正在尝试尽可能正确地学习其中的技巧。 Core Data 显然是那些短期内不会流行的技术之一,所以我不妨“正确地学习它”。

以具有两个实体的核心数据模型为例:

  1. 食物

PersonFood 有 2 个一对多关系:

  1. favoriteFoods(一对多)
  2. hatedFoods(一对多)

(Person 和 Food 也是 NSManagedObject 的子类。)

在之前的数据模型中,Person 维护了两个NSArray 实例变量。如果我想要最喜欢的食物,我可以致电:

Person *fred = [[Person alloc] init];    
NSArray *fredsFavorites = fred.favoriteFoods;

轻松挤压。

我正在阅读 Core Data 的文档,但在给定 NSFetchRequest 的情况下,我似乎找不到获取此 NSArray 的正确方法,因为 我无法定义我想要获得的关系对象来自。

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Food" inManagedObjectContext:[fred managedObjectContext]]];
[request setIncludesSubentities:NO];
NSArray *fredsFavoriteAndHatedFoods = [[fred managedObjectContext] executeFetchRequest:request error:nil];

这将返回存储在favoriteFoodshatedFoods 中的所有Food 项。我怎样才能把这些分开?当然有一个简单的解释,但我目前还没有很好地掌握这个概念,无法用核心数据行话来解释它,因此我的谷歌搜索没有结果。

【问题讨论】:

    标签: objective-c xcode core-data entity-relationship


    【解决方案1】:

    获取它最直接的方法是直接访问关系NSSet

    NSArray *fredsFavorites = [fred.favoriteFoods allObjects];
    

    (我已经展示了如何从生成的NSSet 中获取NSArray)。

    或者,如果您设置了反向关系(您应该这样做),您可以使用这样的获取请求:

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"Food" inManagedObjectContext:[fred managedObjectContext]]];
    [request setPredicate:[NSPredicate predicateWithFormat:@"ANY personsWithThisAsFavorite == %@", fred]];
    NSArray *fredsFavoriteFoods = [[fred managedObjectContext] executeFetchRequest:request error:nil];
    

    这假设personsWithThisAsFavoritefavoriteFoods 成反比关系。除非我看错了你的例子,否则favoriteFoods 应该是一个多对多的关系,因为一个人可以有多种最喜欢的食物,而一种食物可以有多个人最喜欢这种食物。

    (请注意,我没有对此进行测试,因此NSPredicate 可能不是 100% 正确)

    【讨论】:

    • 完美 - [fred.favoriteFoods allObjects] 位正是我想要的。不过,后续问题 - 有没有办法在该调用中对 NSArray 进行排序,例如。 [fred.favoriteFoods allObjectsUsingSortDescriptor:myDescriptor]?还是需要我在返回的 NSArray 上调用 sort 方法? (似乎在第一个方法调用期间对它进行排序需要更少的内存。)
    • 是的,您可以使用allObjectsUsingSortDescriptor:。根据您的具体情况,在获取请求本身中进行排序可能会更快,或者在加载对象后在 RAM 中进行排序(使用allObjectsUsingSortDescriptor: 或类似的东西)。这实际上取决于您的确切数据模型以及您正在使用的数据量。当我说“获取请求本身”时,我指的是NSFetchRequest.sortDescriptors 属性。
    • 哦 - 甚至没有看到 NSFetchRequest 上的 sortDescriptors 属性。不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多