2016-11-25 59 views
0

我对Android开发颇为陌生,目前我正在尝试制作媒体播放器。我的下一个目标是实现一个播放列表系统,可以添加和删除项目,并且可以在触发onCompleteListener()时自动删除项目。我使用ContentResolver的用于MP3文件的动态播放列表Android

public void getSongList(){ 
     ContentResolver musicResolver=getContentResolver(); 
     Uri musicUri= MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     Cursor musicCursor=musicResolver.query(musicUri,null,null,null,null); 

     if(musicCursor!=null && musicCursor.moveToFirst()){ 
      //get columns 
      int titleColumn = musicCursor.getColumnIndex 
        (android.provider.MediaStore.Audio.Media.TITLE); 
      int idColumn = musicCursor.getColumnIndex 
        (android.provider.MediaStore.Audio.Media._ID); 
      int artistColumn = musicCursor.getColumnIndex 
        (android.provider.MediaStore.Audio.Media.ARTIST); 
      //add songs to list 
      do { 
       long thisId = musicCursor.getLong(idColumn); 
       String thisTitle = musicCursor.getString(titleColumn); 
       String thisArtist = musicCursor.getString(artistColumn); 
       songList.add(new Song(thisId, thisTitle, thisArtist)); 
      } 
      while (musicCursor.moveToNext()); 
     } 
    } 

在这一点上我有它设置这样我可以在ListView点击项目,它可以开始通过服务播放的歌曲目前拉动从SD卡中的歌曲。我的问题是存储歌曲URI和位置数据的最佳方式是什么。我还希望应用程序能够在应用程序重新启动时将播放列表存储在最后位置,即使在onDestroy()后也是如此。我不确定哪种数据集最适合用来存储这些数据,以及如何检索它们。任何帮助将非常感激!

回答

0

您需要将歌曲数据保存到设备

Android框架提供了多种选择和战略的持久性:

  • 共享偏好 - 轻松保存基本数据作为一个私人键值对坚持字典。
  • 本地文件 - 将任意文件保存到内部或外部设备存储。
  • SQLite数据库 - 在特定于应用程序的数据库中的表中存储数据。
  • ORM - 使用更高级别的查询/更新语法描述并保留模型对象。

使用案例

每个存储选项通常是相关联的使用情况如下:

  • 共享偏好 - 用于应用程序的喜好,钥匙,和会话信息。
  • 本地文件 - 通常用于BLOB数据或数据文件缓存(即磁盘镜像缓存)
  • SQLite数据库 - 用于复杂的本地数据操作或原始速度
  • ORM - 用于在本地存储简单的关系数据以减少SQL样板文件

了解更多:Persisting Data To Device


您可以使用其中的一个选项,但是你的目的,SQLite数据库ORM是更好的选择。

您可以访问SQLite数据库的Local Databases with SQLiteOpenHelper

对于ORM,您可以尝试greenDAO

+0

我打算使用SQLite的播放列表,但我想知道格式。我认为我会指定一个位置编号来跟踪订单,但是在完成歌曲后,所有其他条目都必须更新,这将会很笨重。我能想到的另一种方法是让它们永远增加,但最终会变得庞大。你会怎么做? –

+0

为了解决这个问题,我宁愿为轨道制作一张单独的桌子。因此,我们创建的表格只包含songId和trackNumber列,而不是用歌曲数据和曲目制作表格。作为外键的SongId列将指向歌曲数据表中的歌曲。 –