使用MPMediaItemPropertyPersistentID的“addFilterPredicate”功能一次查询两首以上的歌曲

时间:2011-04-07 02:26:41

标签: iphone cocoa-touch mpmediaquery

我的应用会在启动时自动加载音乐播放列表。为此,我将歌曲ID MPMediaItemPropertyPersistentID存储到数据库,并在下次启动应用程序时加载歌曲。主要代码如下:

MPMediaQuery *MPMediaSongQuery = [MPMediaQuery songsQuery];

MPMediaPropertyPredicate *iPodMusicSongPredicateiPodMusicSongPredicate = [MPMediaPropertyPredicate 
                                  predicateWithValue:[NSNumber numberWithUnsignedLongLong: songID] 
                                  forProperty:MPMediaItemPropertyPersistentID     
                                  comparisonType:MPMediaPredicateComparisonEqualTo];

[MPMediaSongQuery addFilterPredicate:iPodMusicSongPredicate];
NSArray *collections = MPMediaSongQuery.collections;

代码逐个加载歌曲。我的问题是:在使用MPMediaItemPropertyPersistentID函数时,有没有办法按addFilterPredicate:一次查询两首或更多首歌曲?感谢。

1 个答案:

答案 0 :(得分:2)

如果您使用多个addFilterPredicate,它们将与逻辑AND结合使用。因此,您只能减少第一个查询的结果,但不能扩展它。因此,不允许对同一属性使用多个addFilterPredicates。事实上,结果是未定义的,很可能最终会出现在空集合中。您正在寻找的是相同属性与逻辑OR的组合。您可以像以下伪代码中所描述的那样实现此目的:

MPMediaQuery *MPMediaSongQuery = [MPMediaQuery songsQuery];

NSMutableArray *collections = [[NSMutableArray alloc] initWithCapacity:1];

for (int i=0; i < songIDCount; i++) {

   MPMediaPropertyPredicate *iPodMusicSongPredicateiPodMusicSongPredicate = [MPMediaPropertyPredicate 
                                  predicateWithValue:[NSNumber numberWithUnsignedLongLong: songID[i]] 
                                  forProperty:MPMediaItemPropertyPersistentID     
                                  comparisonType:MPMediaPredicateComparisonEqualTo];

   [MPMediaSongQuery addFilterPredicate:iPodMusicSongPredicate];

   [collections addObjectsFromArray:MPMediaSongQuery.collections];

   [MPMediaSongQuery removeFilterPredicate:iPodMusicSongPredicate];

}

...