核心数据获取与实体和实体关系的过滤器,很多

时间:2013-05-16 19:01:49

标签: ios core-data nspredicate nsfetchrequest nsentitydescription

我需要一个获取请求的帮助,该请求可以过滤子女和父母之间存在多对多关系的子女。我发现的所有例子都是针对一对多关系的。

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

enter image description here

我正在尝试找到一个已过滤的Song对象列表,其中播放列表id = 1且歌曲名称以“a”开头。

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

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

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

2 个答案:

答案 0 :(得分: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/可能不会发生在核心数据上: - )

答案 1 :(得分:0)

当然,经过几个小时的努力解决这个问题后,我在发布这个问题后几分钟就找到了答案。

NSString *queryStr = [NSString stringWithFormat:@"ANY playlists.playlist_id =[cd] \"%@\" AND name BEGINSWITH[c] \"%@\"", playlistID, songQuery];
[request setPredicate:[NSPredicate predicateWithFormat: queryStr]];
相关问题