我是核心数据的新手,我不知道如何使用核心数据编写这样的查询。
我在架构中有两个实体专辑和歌曲。专辑与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
代码中有什么问题吗?
答案 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];