与Core Data有很多关系

时间:2013-10-17 21:55:59

标签: sql objective-c ruby-on-rails core-data magicalrecord

假设我有3种型号:酒店,类别和房间。 一个酒店有很多类别,一个类别有很多房间。

我想得到一个特定酒店所有房间号码的数组。

在Rails中,使用ActiveRecord,我会有以下内容:

class Hotel
  has_many :categories
  has_many :rooms, through: :categories
end
class Category
  has_many :rooms
end

然后,如果我有一个酒店对象,查询将如下:

hotel.rooms.map(&:room_number)

我会为酒店获得一系列房间号码。

如何使用Objective-C和Core Data实现相同的目标? MagicalRecord可以帮助这种类型的抽象吗?我是否必须直接编写SQL语句,因为当前的ORM不支持这样的任何内容?

谢谢, 尼古拉斯

2 个答案:

答案 0 :(得分:2)

假设关系定义如下:

enter image description here

您可以使用“键值编码”来获取给定酒店的所有房间号码:

Hotel *theHotel = ...;
NSSet *setOfRoomNumbers = [theHotel valueForKeyPath:@"categories.@distinctUnionOfSets.rooms.roomNumber"];
// And if you need an array instead of a set:
NSArray *arrayOfRoomNumbers = [setOfRoomNumbers allObjects];

这种方法的一个缺点是它首先获取所有类别,然后是房间。

或者,您可以使用。执行“Room”实体的获取请求 反向关系:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Room"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"category.hotel == %@", theHotel];
request.predicate = predicate;
NSArray *rooms = [context executeFetchRequest:request error:&error];
NSArray *roomNumbers = [rooms valueForKey:@"roomNumber"];

使用魔法记录,这可能看起来像(未经测试):

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"category.hotel == %@", theHotel];
NSArray *rooms = [Room MR_findAllWithPredicate:predicate];
NSArray *roomNumbers = [rooms valueForKey:@"roomNumber"];

答案 1 :(得分:0)

您不需要使用Core Data编写任何SQL查询,尤其是使用Magical Record。 以下是有关如何获取对象和关系的文档的link

一个简单的例子是:

NSArray *rooms = @[@1, @2, @3, @4];
NSPredicate *roomFilter = [NSPredicate predicateWithFormat:@"Rooms IN %@", rooms];

NSArray *rooms = [Person MR_findAllWithPredicate:roomFilter];

这只是一个示例代码,不要将其视为完全正常运行且经过测试的解决方案。