Search code examples
iosmpmediaitemmpmediaquerympmediaitemcollection

MPMediaQuery invalid value


I'm running an MPMediaQuery to find a song in the user's iPod library, like this:

MPMediaQuery *songQuery = [MPMediaQuery songsQuery];

[songQuery addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:track.title forProperty:MPMediaItemPropertyTitle comparisonType:MPMediaPredicateComparisonEqualTo]];

[songQuery addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:track.album forProperty:MPMediaItemPropertyAlbumTitle comparisonType:MPMediaPredicateComparisonEqualTo]];

[songQuery addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:track.artist forProperty:MPMediaItemPropertyArtist comparisonType:MPMediaPredicateComparisonEqualTo]];


*** CRASH HERE ***
if (songQuery.items.count > 0) {

    return [songQuery.items objectAtIndex:0];

}

else {

    return nil;

}

The app crashes and spits out:

'invalid value (nil) for property item_extra.title.'

Am I doing anything wrong? Is there a better way to query for a song? Thanks everyone!


Solution

  • On this line:

    [songQuery addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:track.title forProperty:MPMediaItemPropertyTitle comparisonType:MPMediaPredicateComparisonEqualTo]];
    

    The value for track.title is nil. You need to do a check, such as:

    if (track.title != nil)
    {
    [songQuery addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:track.title forProperty:MPMediaItemPropertyTitle comparisonType:MPMediaPredicateComparisonEqualTo]];
    }
    

    Edit: I would recommend doing a check on each of the variables that you would be adding as a filter predicate to make sure they are also not nil!