加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 针对特定关系的核心数据NSFetchRequest?

发布时间:2020-12-14 17:45:21 所属栏目:百科 来源:网络整理
导读:我正在将以前存储在 XML中的现有数据模型转换为Core Data,所以我试图尽可能正确地学习绳索.核心数据显然是那些不会在任何时候出现的技术之一,所以我不妨“正确地学习它”. 以两个实体为例的核心数据模型: 人 食物 人与食物有2对一的关系: 最喜欢的食物(1对
我正在将以前存储在 XML中的现有数据模型转换为Core Data,所以我试图尽可能正确地学习绳索.核心数据显然是那些不会在任何时候出现的技术之一,所以我不妨“正确地学习它”.

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

>人
>食物

人与食物有2对一的关系:

>最喜欢的食物(1对多)
>讨厌的食物(1对多)

(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];

这将返回存储在favoriteFoods和hatedFoods中的所有Food项目.我该如何拆分它们?当然有一个简单的解释,但我目前还没有很好地掌握这个概念,无法用Core Data术语解释它,因此我的谷歌搜索毫无结果.

解决方法

获得它的最简单方法是直接访问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];

这假设人们与最喜欢的人是喜爱的食物的反向关系.除非我读错你的例子,否则最喜欢的食物应该是多对多的关系,因为一个人可以有多种喜欢的食物,而食物可以让多个人以这种食物为最爱.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读