2012-04-24 34 views
2

我有以下幾點:搜索多種類型與MPMediaPropertyPredicate

MPMediaPropertyPredicate *titlePredicate = [MPMediaPropertyPredicate predicateWithValue:textString 
                      forProperty:MPMediaItemPropertyTitle 
                     comparisonType:MPMediaPredicateComparisonContains]; 

NSSet *predicateSet = [NSSet setWithObject:titlePredicate]; 
MPMediaQuery *searchQuery = [[MPMediaQuery alloc] initWithFilterPredicates:predicateSet]; 
NSArray *itemsFromTextQuery = [searchQuery items]; 

for (MPMediaItem *song in itemsFromTextQuery) 
{ 
    [arrayOfSongItems addObject:song]; 
} 

偉大的工程,但只有搜索的曲目的標題。我希望它能返回標題,藝術家和專輯名稱的結果。

回答

4

嘗試下面的代碼

MPMediaQuery* query = [MPMediaQuery albumsQuery]; 

[query addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:self.strArtist forProperty:MPMediaItemPropertyArtist]] 

[query addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:self.strTitle forProperty:MPMediaItemPropertyAlbumTitle]]; 
+0

這假設兩個字符串是不同的。我希望能夠像iPhone的iPod應用程序的搜索表一樣顯示藝術家和/或專輯&或找到的曲目。 – daidai 2013-02-06 12:19:51

4

這個工作對我來說:

MPMediaQuery *searchQuery = [[MPMediaQuery alloc] init]; 
NSPredicate *test = [NSPredicate predicateWithFormat:@"title contains[cd] %@ OR albumTitle contains[cd] %@ OR artist contains[cd] %@", searchString, searchString, searchString]; 
NSArray *filteredArray = [[searchQuery items] filteredArrayUsingPredicate:test]; 

//NSLog(@"%@", [filteredArray valueForKeyPath:@"title"]); 

for (MPMediaItem *song in filteredArray) 
{ 
    [arrayOfSongItems addObject:song]; 
} 

我基本上後過濾正從媒體查詢的所有項目。我不認爲我的解決方案比首先過濾查詢更好,但絕對比單獨搜索三次更好。或者多次遍歷數組。

+0

這一切都很好 - 但是你怎麼知道它是一首曲目,專輯還是藝術家? – daidai 2013-02-07 04:21:42

+0

如果你需要這些信息,那麼最新的問題不是使用3個查詢?你可以使用我的解決方案,然後在for循環中檢查這三個值if([song.title isEqualToString:searchString]){}'等等。如果你使用3個查詢並且想合併它們,你可以在添加新的元素與你的數組與'if([arr indexOfObject:@「new Item」== NSNotFound){// add new Item}' – 2013-02-07 13:59:05

+0

問題是性能。在整個圖書館中運行3次查詢可能需要幾秒鐘的時間 - 蘋果音樂播放器可以很快完成。 – daidai 2013-09-18 06:05:08