共享prefrence覆盖
我保存一个字符串设置在加载到我的监视列表的共享偏好设置中。当用户点击一个按钮时,在电影的页面中,它将电影的名称,标题和发布日期存储在一个JSON对象中。所有这些都存储为字符串。当我尝试在观察列表中添加一部电影时,问题仍然存在,每添加一部新电影,最后一部电影被覆盖,这意味着我一直只能在观看列表中看到一部电影。共享prefrence覆盖
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences sharedPreferences = getSharedPreferences("WatchlistData", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
JSONObject obj = new JSONObject();
try {
obj.put("name", name);
obj.put("date", releaseDate);
obj.put("platform", platform);
} catch (JSONException e) {
e.printStackTrace();
}
Set<String> set = new HashSet<String>();
set.add(obj.toString());
editor.putStringSet("setOfStrings", set);
editor.commit(); //saved
}
});
关注预订片段OnCreateView
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_watchlist, container, false);
mRecyclerView = (RecyclerView) view.findViewById(R.id.watchlist);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mWatchlistAdapter = new WatchlistAdapter(getActivity(), loadFromStorage());
mWatchlistAdapter.notifyDataSetChanged();
mRecyclerView.setAdapter(mWatchlistAdapter);
return view;
}
的loadFromStorage,加载在recyclerview我的XML文件中,这个方法在我的适配器构造函数。
SharedPreferences mPrefs = getActivity().getSharedPreferences("WatchlistData", Context.MODE_PRIVATE);
ArrayList<watchlist> items = new ArrayList<watchlist>();
Set<String> set = mPrefs.getStringSet("setOfStrings", null); //retrieving set of strings
if (set == null){
Toast.makeText(getActivity(), "No data found", Toast.LENGTH_LONG).show();
} else {
//for every string in set
for (String s : set) {
try {
JSONObject jsonObject = new JSONObject(s); //for every JSONObject String
String name = jsonObject.getString("name");
String date = jsonObject.getString("date");
String platform = jsonObject.getString("platform");
watchlist newGame = new watchlist();
newGame.setGame(name);
newGame.setDate(date);
newGame.setPlatform(platform);
items.add(newGame);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
return items;
}
默认情况下SharedPreferences
用较新的数据替换旧数据。你可以做的是,让旧数据第一,然后用追加与新的一个,
//Extract the value stored in SharedPreferences
String value = prefs.getString(<Key>, <DefaultValue>);
//Append to the extracted value
String appendedValue = append(value, newValue);
//Write the result back to SharedPreferences
editor.putString(<Key>, appendedValue).commit();
SharedPreferenced
是为精简版重量数据重发存储但不。因此,根据您的要求,您应该将数据写入外部存储中的JSON/XML文件并稍后再读取。
看起来你只是覆盖每次你把东西有时间在SharedPreferences的stringset,这就是为什么你永远只看到最后的结果:
Set<String> set = new HashSet<String>();
set.add(obj.toString());
editor.putStringSet("setOfStrings", set);
你只是创建了一个新的“设置'每次点击并保存到“setOfStrings”。
我正在考虑一个类似的实现我自己的项目,但看到它成为从SharedPreferences操纵StringSet的问题。作为参考,[Android开发人员网站上的文档](http://developer.android.com/reference/android/content/SharedPreferences.html#getStringSet(java.lang.String,java.util.Set)) states, “请注意,您不得修改此调用返回的set实例。你做的,也不是你修改实例的能力。“
对此有一些解决方法,但根据我的理解,最好避免使用SharedPreferences来处理这种常常会被操作的数据,因为它只是保存为一个容易出现问题的XML文件 - 您可能需要考虑在SQLite数据库中实现这些信息。
您确定没有其他解决方法? –
您能否给我一个关于在外部存储中保存为JSON/XML的教程? –
你能给我一个关于在外部存储中保存为JSON/XML的教程吗? –