如何使用Android中的内容解析器从流派列表中查询相册唯一ID

时间:2014-11-16 06:18:41

标签: android

我正在开发音乐应用程序,我有一个基于艺术家,流派,专辑等的歌曲列表。现在我想要的是来自所选Genre的独特专辑ID。例如:

如果AlbumId1中有五首歌曲。然后,当我选择其类型时,将显示5首具有相同专辑ID的歌曲。但我想只获得一个实例而不是5个相同ID的实例。如何实现这一点..请帮忙!

List<Track> trackList = new ArrayList<Track>();
String orderBy=android.provider.MediaStore.Audio.Albums.ALBUM_ID;
String selection= android.provider.MediaStore.Audio.Albums.ALBUM_ID ;
Cursor cursor = context.getContentResolver().query(
                MediaStore.Audio.Genres.Members.getContentUri("external",
                        categoryID), null, selection, null, orderBy);

使用此查询获取所有专辑ID并且很少也是重复的。我只想要唯一的ID,并希望删除所有重复的ID。如何实现这一点。?

2 个答案:

答案 0 :(得分:0)

如果您正在使用音乐应用,最好让光标查询设备中的所有歌曲,因为您无疑需要在列表中显示该列表。因此,如果您的光标包含重复的专辑(因为几首歌曲将属于一个专辑),您可以在实际填充列表时解决问题。

因此,如果您使用适配器填充具有不同相册名称的列表视图,只需在光标上运行循环并仅将不同的相册名称存储在另一个列表中,然后使用此列表填充列表视图。所以它看起来像这样:

String temp, cval;
        ArrayList<String> albumlist = new ArrayList<>();
        cursor.moveToFirst();
        temp = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
        albumlist.add(temp);
        do
        {
            cval = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
            if(!temp.equals(cval))
            { 
             //Here you can check for it's genre as well, up to you
                    albumlist.add(cval);
                    //Only add the distinct album names to albumlist
                }
                temp = cval;
            } while(cursor.moveToNext());

如果你仍然想按照类型进行查询,你可以这样做并仍然使用上述代码的版本从歌曲中获取不同的专辑ID

答案 1 :(得分:0)

我还需要从Albums获取特定Genre的{​​{1}},这就是我的做法:

您只需要 GROUP BY 相册,即可获得该特定类型的专辑

MediaStore