在Android中存储播放列表的正确方法

时间:2015-01-11 14:54:50

标签: android architecture sharedpreferences

我正在开发一款能够播放歌曲列表的应用。它主要不是音乐播放器,因此不需要多个播放列表。我一直在使用SharedPreferences来存储用户从他们的MediaStore中选择的歌曲列表。

我一直将它们存储在SharedPreferences文件中,如下所示(伪代码):

Key = "Song"+n
Value = _ID

当我需要检索歌曲ID时,我只循环浏览文件for "Song"+0 to "Song"+n

这个工作正常,直到我需要从列表中删除一首歌。显而易见的解决方案是在列表中删除相关歌曲及其后的所有歌曲,然后用比以前少的索引编号替换那些歌曲。

关于这个问题对我来说很难闻,所以我的问题是:

  1. 我所描述的是存储列表的根本不好的方法吗?
  2. 如果不好,什么是更好的选择?
  3. 如果以这种方式使用SharedPreferences是合理的,那么我想删除项目并重新索引列表是一个好主意吗?
  4. 如果这不是一个好主意,那么什么是更好的选择呢?
  5. 提前谢谢你,安德鲁

3 个答案:

答案 0 :(得分:0)

  

我所描述的是存储列表的根本不好的方法吗?

如果您希望列表包含大量数据,那么这不是存储数据的最佳方式。

请注意,首次加载后SharedPreferences会缓存,因此加载数据的磁盘访问需要一段时间。您可以尝试在测试套件的早期加载SharedPreferences以避免这种惩罚。

此外,解析XML文件并更新数据在android中非常耗时。不建议这样做。

  

如果不好,那么什么是更好的选择呢?

我建议将数据插入SQLite

  

如果以这种方式使用SharedPreferences是合理的,那么就是我的想法   删除项目和重新索引列表是一个好主意?

答案是否定的。上述原因。

  

如果这不是一个好主意,那么什么会更好   替代?

从SQLite中检索数据并将其存储在JSON对象中。如果使用XML将在几秒钟内检索和更新,通过使用JSON,它将在几毫秒内发生。

请随时添加/更新答案以了解更多详情。

答案 1 :(得分:0)

有关将JSON数组的内容存储到SharedPreferences的示例,请参阅this answer。您也可以 - 并且可能应该 - 将JSON数组作为文件存储到设备的文件系统中

    public void saveJSONObjectAsFile(String path, JSONObject obj){

    File mFile = new File(path);
    OutputStream outputStream = null;
    try {
        outputStream = new FileOutputStream(mFile);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        outputStream.write(obj.toString().getBytes());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        outputStream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }  
}

就个人而言,我不会为了这样一个相对简单的数据支持而乱用SQLite。

答案 2 :(得分:0)

使用SharedPreferences添加/删除列表中的歌曲的一个非常简单的示例(该示例假定您的歌曲ID是数字)

// SharedPreferences
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor prefsEditor = prefs.edit();

// example song ID selected by user
int selectedSongId = 123;

// example of deleting a song ID...
try {
    // get currently stored songs list
    JSONArray currentItems = new JSONArray(prefs.getString("songs", new JSONArray().toString()));
    // init a new empty songs list
    JSONArray updatedItems = new JSONArray();
    for (int i = 0; i < currentItems.length(); i++) {
        // loop through currently stored list, put each item into new list
        // except for the Id user has selected to delete
        int songId = currentItems.getInt(i);
        if (songId != selectedSongId) {
            updatedItems.put(songId);
        }
    }
    // replace old songs list with the new list and save to SharedPreferences
    prefsEditor.putString("songs", currentItems.toString()).commit();
} catch (JSONException e) {
    e.printStackTrace();
}

// example of adding a song ID to existing songs list
try {
    // get currently stored songs list
    JSONArray currentItems = new JSONArray(prefs.getString("songs", new JSONArray().toString()));
    // add new song Id to list
    currentItems.put(selectedSongId);
    // save updated songs list back to SharedPreferences
    prefsEditor.putString("songs", currentItems.toString()).commit();
} catch (JSONException e) {
    e.printStackTrace();
}

有更有效的方法可以做到这一点,但这个简化的例子有望帮助您指明方向;)

PS - 我没有运行它就输入了示例,某处可能出现错误