假设我有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不支持这样的任何内容?
谢谢, 尼古拉斯
答案 0 :(得分:2)
假设关系定义如下:
您可以使用“键值编码”来获取给定酒店的所有房间号码:
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];
这只是一个示例代码,不要将其视为完全正常运行且经过测试的解决方案。