Cra*_*tis 4 xcode entity-relationship core-data objective-c
我正在将以前存储在XML中的现有数据模型转换为Core Data,因此我正在尝试尽可能正确地学习绳索.核心数据显然是那些不会在任何时候出现的技术之一,所以我不妨"正确地学习它".
以两个实体为例的核心数据模型:
人与食物有2对一的关系:
(Person和Food都是NSManagedObject的子类.)
在之前的数据模型中,Person维护了两个NSArray实例变量.如果我想要最喜欢的食物,我可以打电话:
Person *fred = [[Person alloc] init];
NSArray *fredsFavorites = fred.favoriteFoods;
Run Code Online (Sandbox Code Playgroud)
容易挤压.
我正在阅读Core Data的文档,我似乎无法找到获得此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];
Run Code Online (Sandbox Code Playgroud)
这将返回所有的食品存储在这两个项目favoriteFoods和hatedFoods.我该如何拆分它们?当然有一个简单的解释,但我目前还没有很好地掌握这个概念,无法用Core Data术语解释它,因此我的谷歌搜索毫无结果.
获得它的最简单方法是直接访问关系NSSet:
NSArray *fredsFavorites = [fred.favoriteFoods allObjects];
Run Code Online (Sandbox Code Playgroud)
(我已经展示了如何NSArray从结果中得到一个NSSet).
或者,如果你没有设置反向关系(你应该),你可以使用这样的获取请求:
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];
Run Code Online (Sandbox Code Playgroud)
这假设personsWithThisAsFavorite是与之相反的关系favoriteFoods.除非我读错你的例子,favoriteFoods否则应该是一个多对多的关系,因为一个人可以有多种喜欢的食物,而食物可以让多个人以这种食物为最爱.
(请注意,我没有对此进行测试,因此NSPredicate可能不是100%正确)
| 归档时间: |
|
| 查看次数: |
6713 次 |
| 最近记录: |