2013-04-26 130 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