核心数据根据实体关系计数得到结果

时间:2013-04-26 07:11:56

标签: iphone ios xcode ipad core-data

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

我在架构中有两个实体专辑和歌曲。专辑与Song有很多关系,关系名称是曲目。我写了一个查询来获取所有专辑,这是很好的。但现在我想做一些改变,以便我不会让专辑有0首歌曲。 我尝试根据请求设置谓词,如

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

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

代码 -

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 

代码中有什么问题吗?

2 个答案:

答案 0 :(得分:2)

你试过这个:

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

编辑:

尝试启用SQLDebug并查看生成的SQL语句。您的fetchrequest正在完成时,您将在控制台中找到该语句。以下是如何做到这一点: 将-com.apple.CoreData.SQLDebug 1添加到启动时传递的参数(在“Edit Scheme ...”下)

答案 1 :(得分:0)

EDITED:这将使您商店中的所有专辑都没有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];