2013-04-26 175 views
2

我是核心数据的新手,我不知道如何使用核心数据编写像这样的查询。根据关系实体数核心数据获取结果

我在模式中有两个实体Album和Songs。专辑与Song有许多关系,关系名称是曲目。我有写查询来获取所有相册,这是行之有效的。但是现在我想在这方面做些小改变,这样我就不会得到有0首歌曲的专辑。 我试图设置谓词要求如

[email protected] != 0 
[email protected] != 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:@"[email protected] > 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 

什么是错的代码开机调试模式后上了车控制台?

+1

'tracks。@ count!= 0'应该可以工作。 – 2013-04-26 07:43:51

+0

如果您包含代码并更好地描述问题,它会有所帮助。 *这是行不通的*真的不足以让我们帮你弄清楚为什么它不起作用。 – Caleb 2013-04-26 08:44:22

回答

0

编辑:这将让您的商店的所有专辑是不会有0歌曲/跟踪

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

[fetchRequestItems setPredicate:[NSPredicate predicateWithFormat:@"[email protected] != 0 "]]; 

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

NSUInteger count = [managedObjectContext countForFetchRequest:fetchRequestItems error:nil]; 
+0

这是无关 – 2013-04-26 08:26:21

+2

我在编辑它,因为你投下了票,我误读并修改了错误,至少给了一个人一个机会在砰的一声之前纠正他的错误。 – Dev2rights 2013-04-26 08:36:04

+1

对不起,但是检查'Album ==%@'没有任何意义,因为OP想要获取与至少一首歌有关的所有专辑*。 – 2013-04-26 08:42:33

2

您是否尝试过这样的:

[NSPredicate predicateWithFormat:@"[email protected]>0"]; 

编辑:

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

+0

''track。@ count> 0“'和'”tracks。@ count!= 0“'应该可以正常工作,但必须有其他问题。 – 2013-04-26 08:43:34

+1

是的,你是对的。也许打开SQLDebug会有所帮助 – gasparuff 2013-04-26 08:46:34