Sharedpreferences 在发布版本中保存 arraylist<integer> 和双值
Sharedpreferences saving arraylist<integer> with double values in release version
所以我遇到了一个问题,我似乎找不到原因,所以我在这里寻求帮助。
我能够找到问题的根源,但我找不到它发生的原因,这就是我所拥有的。
这是我试图保存在共享首选项中的示例。
public class Registo implements Serializable {
int id;
String name;
ArrayList<Integer> commitedViolations= new ArrayList<>();
}
保存的过程都是我做的
public void addRegisto(Context context, Registo registo) {
ArrayList<Registo> registos = getRegistos(context);
if (registos == null)
registos = new ArrayList<>();
registos.add(registo);
saveRegistos(context, registos);
}
public void saveRegistos(Context context, ArrayList<Registo> favorites) {
// used for store arrayList in json format
SharedPreferences settings;
SharedPreferences.Editor editor;
settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
editor = settings.edit();
Gson gson = new Gson();
String jsonFavorites = gson.toJson(favorites);
editor.putString(REGISTOS, jsonFavorites);
editor.apply();
}
这就是神奇的地方,当我检索我保存在设备中的对象时,使用以下值 [200、201、202] 保存的对象的 arrayList,现在 returns 它们作为双精度值 [200.0, 201.0, 202.0].
我做了一个解决方法,但我想知道为什么会这样。
public ArrayList<Registo> getRegistos(Context context) {
SharedPreferences settings;
List<Registo> registos;
settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
if (settings.contains(REGISTOS)) {
String jsonFavorites = settings.getString(REGISTOS, null);
Gson gson = new Gson();
Registo[] registosItems = gson.fromJson(jsonFavorites, Registo[].class);
// <WORKAROUND>
for (Registo registosItem : registosItems) {
for (int i = 0; i < registosItem.getCommitedViolations().size(); i++) {
String str = String.valueOf(registosItem.getCommitedViolations().get(i));
double valueAsDouble = Double.parseDouble(str);
int valueAsInt= (int) valueAsDouble;
registosItem.getCommitedViolations().set(i, valueAsInt);
}
}
// </WORKAROUND>
registos = Arrays.asList(registosItems);
registos = new ArrayList<>(registos);
} else
return null;
return (ArrayList<Registo>) registos;
}
PS。最奇怪的是,调试版本运行完美,这个错误只发生在发布版本上。
for (Registo registosItem : registosItems) {
for (int i = 0; i < registosItem.getCommitedViolations().size(); i++) {
String str = String.valueOf(registosItem.getCommitedViolations().get(i));
int valueAsInt= Integer.parseInt(str);
registosItem.getCommitedViolations().set(i, valueAsInt);
}
}
这应该可以解决有关双打的问题,为什么不直接解析字符串?
这是 gson
的问题,与 SharedPreferences
无关,因为它们不会修改您正在保存的字符串。
错误在于 gson
序列化和反序列化 Integer
。你可以看到一个关于这个的问题 here.
所以我遇到了一个问题,我似乎找不到原因,所以我在这里寻求帮助。 我能够找到问题的根源,但我找不到它发生的原因,这就是我所拥有的。
这是我试图保存在共享首选项中的示例。
public class Registo implements Serializable {
int id;
String name;
ArrayList<Integer> commitedViolations= new ArrayList<>();
}
保存的过程都是我做的
public void addRegisto(Context context, Registo registo) {
ArrayList<Registo> registos = getRegistos(context);
if (registos == null)
registos = new ArrayList<>();
registos.add(registo);
saveRegistos(context, registos);
}
public void saveRegistos(Context context, ArrayList<Registo> favorites) {
// used for store arrayList in json format
SharedPreferences settings;
SharedPreferences.Editor editor;
settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
editor = settings.edit();
Gson gson = new Gson();
String jsonFavorites = gson.toJson(favorites);
editor.putString(REGISTOS, jsonFavorites);
editor.apply();
}
这就是神奇的地方,当我检索我保存在设备中的对象时,使用以下值 [200、201、202] 保存的对象的 arrayList,现在 returns 它们作为双精度值 [200.0, 201.0, 202.0].
我做了一个解决方法,但我想知道为什么会这样。
public ArrayList<Registo> getRegistos(Context context) {
SharedPreferences settings;
List<Registo> registos;
settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
if (settings.contains(REGISTOS)) {
String jsonFavorites = settings.getString(REGISTOS, null);
Gson gson = new Gson();
Registo[] registosItems = gson.fromJson(jsonFavorites, Registo[].class);
// <WORKAROUND>
for (Registo registosItem : registosItems) {
for (int i = 0; i < registosItem.getCommitedViolations().size(); i++) {
String str = String.valueOf(registosItem.getCommitedViolations().get(i));
double valueAsDouble = Double.parseDouble(str);
int valueAsInt= (int) valueAsDouble;
registosItem.getCommitedViolations().set(i, valueAsInt);
}
}
// </WORKAROUND>
registos = Arrays.asList(registosItems);
registos = new ArrayList<>(registos);
} else
return null;
return (ArrayList<Registo>) registos;
}
PS。最奇怪的是,调试版本运行完美,这个错误只发生在发布版本上。
for (Registo registosItem : registosItems) {
for (int i = 0; i < registosItem.getCommitedViolations().size(); i++) {
String str = String.valueOf(registosItem.getCommitedViolations().get(i));
int valueAsInt= Integer.parseInt(str);
registosItem.getCommitedViolations().set(i, valueAsInt);
}
}
这应该可以解决有关双打的问题,为什么不直接解析字符串?
这是 gson
的问题,与 SharedPreferences
无关,因为它们不会修改您正在保存的字符串。
错误在于 gson
序列化和反序列化 Integer
。你可以看到一个关于这个的问题 here.