SharedPreferences 字符串设置为数组顺序问题
SharedPreference StringSet to Array Order Issue
请耐心等待我解释我的问题:
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 没有正确初始化,因为数组中的值被打乱了。即,我们保存时位于最后位置的字符串值现在位于第二位。这与 Sets 到 String 的转换有关吗?还是我遗漏了一些明显的东西?
A Set
不保证顺序。虽然有特定的 Set
实现(例如,LinkedHashSet
)被订购,但这不是 SharedPreferences
使用的。
您的选择是:
将您的应用更改为不关心顺序。
以其他方式保存 SharedPreferences
中的数据。例如,在 this app 中,我使用 JsonReader
/JsonWriter
将 ArrayList
保存为单个 String
值。
以其他方式保存数据(例如,JSON 文件,使用序列号维护顺序的 SQLite 数据库)。
请耐心等待我解释我的问题:
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 没有正确初始化,因为数组中的值被打乱了。即,我们保存时位于最后位置的字符串值现在位于第二位。这与 Sets 到 String 的转换有关吗?还是我遗漏了一些明显的东西?
A Set
不保证顺序。虽然有特定的 Set
实现(例如,LinkedHashSet
)被订购,但这不是 SharedPreferences
使用的。
您的选择是:
将您的应用更改为不关心顺序。
以其他方式保存
SharedPreferences
中的数据。例如,在 this app 中,我使用JsonReader
/JsonWriter
将ArrayList
保存为单个String
值。以其他方式保存数据(例如,JSON 文件,使用序列号维护顺序的 SQLite 数据库)。