我正在开发一款能够播放歌曲列表的应用。它主要不是音乐播放器,因此不需要多个播放列表。我一直在使用SharedPreferences来存储用户从他们的MediaStore中选择的歌曲列表。
我一直将它们存储在SharedPreferences文件中,如下所示(伪代码):
Key = "Song"+n
Value = _ID
当我需要检索歌曲ID时,我只循环浏览文件for "Song"+0 to "Song"+n
这个工作正常,直到我需要从列表中删除一首歌。显而易见的解决方案是在列表中删除相关歌曲及其后的所有歌曲,然后用比以前少的索引编号替换那些歌曲。
关于这个问题对我来说很难闻,所以我的问题是:
提前谢谢你,安德鲁
答案 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 - 我没有运行它就输入了示例,某处可能出现错误