如何以与 iOS 音乐应用程序相同的方式搜索 iPod 库?我想进行一般查询以返回每个艺术家、专辑和歌曲的结果。例如,如果我搜索 Kenny Chesney,我希望歌曲查询返回所有 Kenny Chesney 歌曲(以及其中包含 Kenny Chesney 的任何歌曲标题或专辑。)当我进行此查询并为每个属性(歌曲标题、专辑title, artist name), 返回一个空数组。
这里有一些代码可以让您更好地了解我要完成的工作:
MPMediaPropertyPredicate *songPredicate =
[MPMediaPropertyPredicate predicateWithValue:searchText
forProperty:MPMediaItemPropertyTitle
comparisonType:MPMediaPredicateComparisonContains];
MPMediaPropertyPredicate *albumPredicate =
[MPMediaPropertyPredicate predicateWithValue:searchText
forProperty:MPMediaItemPropertyAlbumTitle
comparisonType:MPMediaPredicateComparisonContains];
MPMediaPropertyPredicate *artistPredicate =
[MPMediaPropertyPredicate predicateWithValue:searchText
forProperty:MPMediaItemPropertyArtist
comparisonType:MPMediaPredicateComparisonContains];
MPMediaQuery *songsQuery = [MPMediaQuery songsQuery];
[songsQuery addFilterPredicate:songNamePredicate];
[songsQuery addFilterPredicate:artistNamePredicate];
[songsQuery addFilterPredicate:albumNamePredicate];
NSLog(@"%@", [songsQuery items]);
我通过分别对每个谓词运行查询来实现这一点,但这看起来效率很低!
最佳答案
以这种方式组合您的谓词使其成为“AND”关系。这意味着您要查询的歌曲的标题、专辑和名称都与搜索文本匹配。
要实现您正在尝试做的事情,您应该运行 3 个查询并以适当的方式组合结果。
如果你运行:
MPMediaPropertyPredicate *artistPredicate =
[MPMediaPropertyPredicate predicateWithValue:searchText
forProperty:MPMediaItemPropertyArtist
comparisonType:MPMediaPredicateComparisonContains];
NSSet *predicates = [NSSet setWithObjects: artistPredicate, nil];
MPMediaQuery *songsQuery = [[MPMediaQuery alloc] initWithFilterPredicates: predicates];
NSLog(@"%@", [songsQuery items]);
这将为您返回与您的搜索相匹配的艺术家。 对歌曲和专辑也应该这样做。
如果这很慢,您可以一次检索所有媒体并手动过滤:
MPMediaQuery *everything = [[MPMediaQuery alloc] init];
NSLog(@"Logging items from a generic query...");
NSArray *itemsFromGenericQuery = [everything items];
for (MPMediaItem *song in itemsFromGenericQuery) {
NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
/* Filter found songs here manually */
}
关于iphone - MPMediaQuery 搜索艺术家、专辑和歌曲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13352767/