2

我是核心数据的新手,我不知道如何使用核心数据编写这样的查询。

我在架构中有两个实体专辑和歌曲。专辑与歌曲通过一对多关系相关,关系名称是曲目。我已经编写了查询来获取所有专辑,并且运行良好。但现在我想在这方面做些小改动,这样我就不会得到包含 0 首歌曲的专辑。我试图根据请求设置谓词,例如

tracks.@count != 0 
tracks.@count != nil

但这不起作用可能是因为故障?我是否需要预取关系或其他东西。我不想在专辑中添加属性歌曲计数,我只需要计数歌曲。编写这样的查询的最佳方法是什么?提前致谢 !

代码 -

NSFetchRequest *request = [[NSFetchRequest alloc] init];
 request.entity = [NSEntityDescription entityForName:@"Album" inManagedObjectContext:[self managedObjectContext]];
 NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
 [request setSortDescriptors:[NSArray arrayWithObject:sort]];  
 NSPredicate *albumPredicate = [NSPredicate predicateWithFormat:@"tracks.@count > 0"];
 [request setPredicate:albumPredicate];

这是我打开调试模式后在控制台上看到的

CoreData: sql: SELECT 0, t0.Z_PK FROM ZALBUM t0 WHERE (SELECT COUNT(*) FROM ZTRACK t1 WHERE (t0.Z_PK = t1.ZALBUM) ) > ? ORDER BY t0.ZNAME COLLATE NSCollateNoCase 

代码有什么问题?

4

2 回答 2

2

你有没有试过这个:

[NSPredicate predicateWithFormat:@"tracks.@count>0"];

编辑:

尝试打开 SQLDebug 并查看生成的 SQL 语句。当您完成 fetchrequest 时,您将在控制台中找到该语句。操作方法如下:将 -com.apple.CoreData.SQLDebug 1 添加到启动时传递的参数中(在“编辑方案...”下)

于 2013-04-26T08:20:04.640 回答
0

已编辑:这将获得您商店中不包含 0 首歌曲/曲目的所有专辑

NSFetchRequest *fetchRequestItems = [[NSFetchRequest alloc] init];
NSEntityDescription *entityList = [NSEntityDescription entityForName:@"Albums" inManagedObjectContext:managedObjectContext];
[fetchRequestItems setEntity:entityList];

[fetchRequestItems setPredicate:[NSPredicate predicateWithFormat:@"tracks.@count != 0 "]];

//Sort by last edit ordered
NSArray *sortDescriptors = [NSArray arrayWithObjects:nil];
[fetchRequestItems setSortDescriptors:sortDescriptors];

NSUInteger count = [managedObjectContext countForFetchRequest:fetchRequestItems error:nil];
于 2013-04-26T08:02:09.620 回答