NSPredicate 和 NSManagedObjects 的 NSSet

Posted

技术标签:

【中文标题】NSPredicate 和 NSManagedObjects 的 NSSet【英文标题】:NSPredicate with NSSet of NSManagedObjects 【发布时间】:2012-10-17 21:08:47 【问题描述】:

我有一个获取请求如下:

NSFetchRequest *songRequest = [NSFetchRequest fetchRequestWithEntityName:@"Song"];

我还有一个名为 GenreFilter 的 NSSet (NSManagedObjects)。

我想设置一个谓词来过滤与genreFilter中的流派有关系的歌曲。

我可以用这种方式设置一个 NSPredicate:

NSPredicate *songRequestPredicate = [NSPredicate predicateWithFormat:@"genre IN %@", [_genreFilter allObjects]];

?

流派如下所示:

@interface Genre : NSManagedObject

@property (nonatomic, strong) NSNumber * id;
@property (nonatomic, strong) NSString * name;
@property (nonatomic, strong) NSSet *preset;
@property (nonatomic, strong) NSSet *song;
@end
@interface Genre (CoreDataGeneratedAccessors)

- (void)addPresetObject:(Preset *)value;
- (void)removePresetObject:(Preset *)value;
- (void)addPreset:(NSSet *)values;
- (void)removePreset:(NSSet *)values;

- (void)addSongObject:(Song *)value;
- (void)removeSongObject:(Song *)value;
- (void)addSong:(NSSet *)values;
- (void)removeSong:(NSSet *)values;

@end

还有这样的歌曲:

@interface Song : NSManagedObject

@property (nonatomic, strong) NSNumber * arousal;
@property (nonatomic, strong) NSNumber * id;
@property (nonatomic, strong) NSNumber * match;
@property (nonatomic, strong) NSNumber * popularity;
@property (nonatomic, strong) NSNumber * valence;
@property (nonatomic, strong) NSNumber * cloud;
@property (nonatomic, strong) Genre *genre;
@property (nonatomic, strong) Year *year;
@property (nonatomic, strong) Period *period;
@property (nonatomic, strong) NSNumber *yearReleased;

@property (nonatomic, assign) float score;
@property (nonatomic, readonly) MPMediaItem *mediaItem;

@end

【问题讨论】:

【参考方案1】:

是的。这在我看来是正确的。

这是我给另一个问题的answer,它包含用于启动和运行准系统核心数据项目的简单说明和代码。我经常使用这个基本设置来快速测试这样的事情。

【讨论】:

好吧,在这种情况下,被比较的字段看起来是一个字符串:NSPredicate *predicate = [NSPredicate predicateWithFormat:@"info.name = %@",self.bankInfo.name]; 我试图比较谓词中的一个对象,但我想这没有多大意义,因为您不能真正将对象表示为字符串。在我的情况下,我应该只使用genre.name,而不是关系中的流派对象。谢谢你的回答,顺便说一句! 不,你可以比较对象!您的谓词对我来说看起来不错......我的示例只是为了提供快速创建基本核心数据项目的步骤,您可以使用该项目(在必要时进行修改)来测试您的谓词。如果您发布问题是因为您的代码不起作用,那么您可以使用这个项目,经过修改以测试您的谓词以隔离问题。如果你发现这个简单的项目有效,那么你就知道你的谓词没问题,而你的问题出在其他地方。再一次,您的谓词看起来不错,您可以比较对象,设置一个小项目可能有助于调试,仅此而已.. 大约需要 5 分钟的时间来设置、创建简单的对象以及您需要测试的关系并粘贴到您的谓词中,确认它没问题,然后在其他地方寻找问题。如果它不起作用,那么它只会是一些简单的错误,因为它对我来说看起来不错。 哦,太好了!好吧,我要试一试。谢谢! 谢谢。有用!直到现在我才有机会尝试。

以上是关于NSPredicate 和 NSManagedObjects 的 NSSet的主要内容,如果未能解决你的问题,请参考以下文章

获取的属性和 NSPredicate

NSPredicate 和过滤

NSPredicate 同时使用 IN 和 LIKE

NSPredicate 和 NSRegularExpression

NSPredicate 用于多个对象和属性

为啥 NSPredicate 和 DateComponents 不起作用