在解释我的问题时请耐心等待:
1)我通过StringSet存储我的首选项,如下所示:
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
// Create a new Arraylist with the details of our details
ArrayList <String> newCityFareDetails = new ArrayList<String>();
// Store various values
newCityFareDetails.add(0, String.valueOf(cloneFare.value1()));
newCityFareDetails.add(1, String.valueOf(cloneFare.value2()));
newCityFareDetails.add(2, String.valueOf(cloneFare.value3()));
newCityFareDetails.add(3, String.valueOf(cloneFare.value4()));
newCityFareDetails.add(4, cloneFare.value5());
// Only value 5 is a string, rest are all floats
// Convert to a hashstring, give it the name of our value
Set<String> set = new HashSet<String>();
set.addAll(newCityFareDetails);
editor.putStringSet(extras.getString("startCity"), set);
// And write it to storage
editor.commit();
现在,我试图按如下方式阅读:
SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, Context.MODE_PRIVATE);
Set<String> tryCityFromPrefs = prefs.getStringSet(currentCity, null);
if (tryCityFromPrefs!=null){
// Crude code, but we convert the preferences into a String array
String[] values = tryCityFromPrefs.toArray(new String[tryCityFromPrefs.size()]);
myFare = new Fare(Float.parseFloat(values[0]), Float.parseFloat(values[1]),
Float.parseFloat(values[2]), Float.parseFloat(values[3]), values[4]);
}
现在,问题是myFare没有正确初始化,因为数组中的值是乱码的。即,我们保存时位于最后位置的字符串值现在位于第2位。这与Sets to String转换有关吗?或者我错过了一些明显的东西?
答案 0 :(得分:1)
Set
不保证订单。虽然订购了特定的Set
实施(例如,LinkedHashSet
),但这不是SharedPreferences
使用的。
您的选择是:
将您的应用更改为不关心订单。
以其他方式将数据保存为SharedPreferences
。例如,在this app中,我使用JsonReader
/ JsonWriter
将ArrayList
保存到单个String
值中。
以其他方式保存数据(例如,JSON文件,带有序列号的SQLite数据库以维护顺序)。