2011-03-17 52 views
4

我正在将之前存储在XML中的现有数据模型转换为核心数据,因此我试图尽可能正确地学习这些绳索。核心数据显然是那些很快就不会去的技术之一,所以我不妨“学习它是正确的”。针对特定关系的核心数据NSFetchRequest?

就拿两个实体核心数据模型:

  1. 食品

有2个一到许多与食物关系

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

(两者Person和食品是NSManagedObject的亚类。)

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

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

容易挤。

我正在阅读核心数据的文档,我似乎无法找到正确的方式来获得这个NSArray NSFetchRequest,因为我无法定义我想从中获取对象的关系。

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食品项目。我怎样才能分解这些?当然这里有一个简单的解释,但我目前并没有把这个概念很好地理解为用Core Data行话来解释它,因此我的Google搜索没有结果。

回答

8

最直接的方式得到它是简单地直接访问的关系NSSet

NSArray *fredsFavorites = [fred.favoriteFoods allObjects]; 

(我已经展示了如何从所得到的NSSetNSArray)。

另外,如果你的避风港反比关系成立(你应该),你可以使用这样的读取请求:

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%正确的)

+0

完美 - 在[fred.favoriteFoods allObjects]位正是我一直在寻找。后续问题虽然 - 有没有一种方法来排序该调用中的NSArray,例如。 [fred.favoriteFoods allObjectsUsingSortDescriptor:myDescriptor]?还是需要我在返回的NSArray上调用排序方法? (看起来好像需要更少的内存在第一次方法调用期间对其进行排序。) – 2011-03-17 02:08:46

+1

是的,您可以使用'allObjectsUsingSortDescriptor:'。根据具体情况,在获取请求本身或者在加载对象(使用'allObjectsUsingSortDescriptor:'或类似的东西)之后在RAM中进行排序可能会更快。这实际上取决于您的确切数据模型以及您正在处理的数据量。当我说“在获取请求本身”时,我指的是“NSFetchRequest.sortDescriptors”属性。 – 2011-03-17 02:21:27

+0

哦 - 甚至没有在NSFetchRequest上看到sortDescriptors属性。尼斯。 – 2011-03-17 02:32:41