1

我需要有关过滤子项和父项具有多对多关系的子项的获取请求的帮助。我发现的所有示例都是针对一对多关系的。

播放列表可以通过歌曲关系包含许多歌曲 歌曲可以通过播放列表关系包含在许多播放列表中。这些关系是彼此相反的。

在此处输入图像描述

我试图找到播放列表 id = 1 且歌曲名称以“a”开头的歌曲对象的过滤列表。

我已经尝试了很多事情,不想包含所有代码,但它们包括尝试子查询、获取播放列表然后尝试在其歌曲 nsset(转换为 nsarray)上运行 nsprediate 以及其他一些事情。

这是我认为最接近我需要的东西。

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Song" inManagedObjectContext:self.playlistRKCoreDataManager.managedObjectStore.mainQueueManagedObjectContext];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSString *queryStr = [NSString stringWithFormat:@"playlists.playlist_id == \"%@\" AND name BEGINSWITH[c] \"%@\"", playlistID, songQuery];
[request setPredicate:[NSPredicate predicateWithFormat: queryStr]];
[request setEntity:entityDescription];
4

2 回答 2

3

您不应该使用stringWithFormat来构建谓词。如果搜索字符串(playlistID、songQuery)包含特殊字符,特别是如果它们包含引号,这将失败"

更好更安全的方法是

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY playlists.playlist_id =[cd] %@ AND name BEGINSWITH[c] %@", playlistID, songQuery];
[request setPredicate:predicate];

因为predicateWithFormat正确处理所有这些情况。

(这与为什么应该使用“准备好的语句”进行 SQL 查询的原因大致相同,即使这样:http: //xkcd.com/327/可能不会在 Core Data 中发生 :-)

于 2013-05-16T19:28:06.913 回答
0

当然,经过数小时试图弄清楚这一点,我在发布这个问题几分钟后找到了自己的答案。

NSString *queryStr = [NSString stringWithFormat:@"ANY playlists.playlist_id =[cd] \"%@\" AND name BEGINSWITH[c] \"%@\"", playlistID, songQuery];
[request setPredicate:[NSPredicate predicateWithFormat: queryStr]];
于 2013-05-16T19:13:23.620 回答