2013-07-15 14 views
2

我在寫mysql查詢,它正確地獲取信息,但是我不能爲此寫NSPredicate,因爲我不知道如何選擇IN(select)構造。將mysql查詢傳輸到NSPredicate

SELECT * FROM ZPHOTO WHERE ZPHOTOID IN (SELECT ZALBUMID FROM ZPHOTO) AND ZALBUMID = 0; 

我把所有的行,其中albumID = 0,如果albumID包含此photoID。

和我nspredicate的一部分:

NSEntityDescription *entity = [NSEntityDescription entityForName:[NSString stringWithFormat:@"%@",name] inManagedObjectContext:context]; 
etchRequest.predicate = [NSPredicate predicateWithFormat:@"photoId IN"] 

更新: 邏輯: 有一個表:screenshot here。我需要返回一行,其中albumId = 0,並且如果此行的photoId在albumId實體中找到。在這個例子中,我需要返回第一行。 邏輯:如果albumId = 0,則是album,如果albumId!= 0,則表示該照片屬於1-st相冊。所以我需要返回所有相冊,其中照片數量不爲零。 與這個謂詞,我只返回所有專輯,也沒有照片的專輯。

"albumId = 0" 

所以我需要篩選沒有照片的相冊。 請幫我

更新2:

返回任何行沒有照片,我想用(PHOTOID IN%@)麻煩,我認爲他找到了ZPK,而不是在ALBUMID實體。

 NSFetchRequest *fr = [[NSFetchRequest alloc]init]; 
     fr.predicate = [NSPredicate predicateWithFormat:@"albumId != %i",statSubId]; // != 0 
     [fr setEntity:entity]; 

     NSError *error; 
     NSArray *albumIds = [context executeFetchRequest:fr error:&error]; 

     NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"photoId" ascending:YES]; 
     [fr setSortDescriptors:[NSArray arrayWithObject:sort]]; 

     fetchRequest.predicate = [NSPredicate predicateWithFormat:@"photoId IN %@ AND albumId == %i", albumIds,statSubId]; 

更新3

這似乎是一個正常工作的解決方案。感謝你們!

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"albumId != %i",statSubId]; // != 0 

NSError *error; 
NSArray *albumIds = [context executeFetchRequest:fetchRequest error:&error]; 

NSMutableArray *albId = [NSMutableArray array]; 
for (Photo *photo in albumIds) { 
    [albId addObject:photo.albumId]; 
} 

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"photoId IN %@ AND albumId == %i", albId,statSubId]; 
+0

如果您描述Photo實體是如何定義的(屬性,關係),這將有所幫助。 –

+0

你定義了什麼*核心數據實體?相片集, ...?他們有什麼屬性? - 請注意,核心數據使用實體之間的關係,而不是ID或外鍵。這可能是因爲你將SQL表「太原始」翻譯成了Core Data。 –

+0

關於照片我只有一個實體,照片和定義的屬性photoId,albumId,即NSNumber,標題和文本。我從服務器獲取照片信息,並且無法更改結構,他們向我發送這樣的信息。 – gronzzz

回答

2

我不認爲有一種方式來實現以單核心數據讀取請求。 你要做這兩個步驟:

  • 抓取所有對象與albumId != 0所得的ID存儲在數組中albumIds
  • 使用謂詞

    [NSPredicate predicateWithFormat:@"albumId == 0 AND photoId IN %@", albumIds] 
    

    得到您想要的結果。

+0

還是你只需要所有不是0的專輯? –

+0

在當前頁面上,我只需要顯示相冊,所以找到的行where albumId = 0 – gronzzz

+0

hm,這很奇怪,但是有任何屬性,有沒有他們albumID!= 0 – gronzzz

0

u可以使用這樣的:

NSPredicate *compoundPredicate = [NSPredicate predicateWithFormat: @"photoId IN(albumId FROM Photo)"]; 
NSPredicate *markPredicate  = [NSPredicate predicateWithFormat: @"ZALBUMID = 0"]; 
NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates: 
            @[compoundPredicate, markPredicate]]; 
+0

我得到這個錯誤:無法解析格式字符串「photoId IN(albumId FROM Photo)」。我認爲,在謂詞中使用FROM是不正確的。 – gronzzz

+0

@gronzzz:如果我們不知道實體是如何定義的,那麼爲您的問題提供正確的解決方案几乎是不可能的。 –

+0

有一個表格:https://api.monosnap.com/image/download?id=H33APSx4ZVwRf99tpNx5rnzhw 我需要返回一行,其中albumId = 0,並且在albumId實體中找到此行的photoId。在這個例子中,我需要返回第一行。 – gronzzz