NSPredicate可以在NSSet中查找具有特定属性的对象。

8

我有一个包含其他NSManagedObject对象的NSSetNSMangedObject对象。

我需要检查这些对象是否在NSSet中有值,然后将它们返回。

我使用MagicalRecord来获取数据。

因此,我需要像这样的代码:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"stringObjects contains %@", string];

如果 NSSet stringObjects 包含我要查找的字符串,那么就返回我请求的对象。
需要注意的是:stringObjects(仅为示例名称,表示我的 NSSet)是包含 NSManagedObjects 的 NSSet,因此我需要通过某个 id(例如 string_id 属性)搜索它们。
因此,模型看起来像这样:
NSSet *set = MainObject.stringObjects;
NSString *string_id_for_first_object = [[[set allObjects] objectAtIndex:0] string_id];

只是为了更好地理解关系。

但问题是如何创建谓词来检查NSSet是否包含所需的id。


一个集合没有顺序,所以第一个对象实际上可以是任何一个。 - Daij-Djan
1个回答

17

如果我正确理解了您的问题,stringObjects 是从一个实体 A 到另一个实体 B 的一对多关系,并且 B 有一个属性 string_id

要查找与具有给定字符串 ID 的任何 B 对象相关联的所有 A 对象,请使用:

NSString *stringId = …; // The string that you are looking for
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY stringObjects.string_id == %@", stringId];

你描述的操作完成后,是否有任何选项可以扩展谓词以仅返回符合该条件的B对象?换句话说,在获取所有stringObjects.string_id == %@的A之后,我希望对于stringObjects的引用仅限于集合中来自B的结果 - 其中string_id == %@。因为在这种类型的获取之后,您将正确地获取所有A,但是当操作A.stringObjects时,您将始终获取与A相关的所有B,而不仅仅是具有主要获取中的string_id == %@的那些B。谢谢 - cybercow
@cybercow:不,这是不可能的。获取请求无法返回“修改”对象。- 如果您需要类似此功能,则最好直接使用给定的string_id获取B对象。 - Martin R
非常感谢您的回答,我最终在A的初始获取请求后直接使用B的NSSet进行谓词搜索,现在已经正常工作。 - cybercow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接