【问题标题】:How to prevent SharedPreferences from loading corrupt data如何防止 SharedPreferences 加载损坏的数据
【发布时间】:2021-09-20 12:04:53
【问题描述】:

我有一个自定义类,其中包含 3 个 String 字段(arg1arg2arg3)和 getter/setter。在Fragment 中有3 个editText 字段创建自定义类的新对象。我还有一个ArrayList 的自定义对象(最大容量为 15,但通常在 1-3 左右),存储在SharedPreferences 中。
一切正常,直到最后一次更新,我只更改了xml 中的一些 UI 设计功能。没有更改任何 Java 代码,尤其是那些与自定义对象有关的代码,ArrayListSharedPrefs
现在,一些用户在更新我的应用程序后,首先(或在大多数情况下,仅)损坏了 ArrayList 的条目,而 arg1""null
最糟糕的是它们显示arg2 的值,其中明确称为textView.setText(arg1)

我将我的SharedPrefs 保存在onStop() 中并在onCreate() 中恢复它,我正在使用Gson/Json 进行存储。在 99.9% 的情况下一切都很好,但是在最近的更新之后,一些用户报告了这个问题。

发生了什么,以及如何防止它在未来发生?

编辑: 我将我的ArrayList 设置为public static,所以我可以在其他地方使用它,这会不会有问题?此外,由于我无法调试生产应用程序,我注意到 args 或其值已经像 MyCustomObject("val1", "val2", "val3") 现在一样移动 MyCustomObject("val2", "val3", "???") 我不知道最后一个值是什么。是val1还是""

【问题讨论】:

    标签: android arraylist sharedpreferences


    【解决方案1】:

    在上次更新之前一切正常,我只更改了一些 xml 中的 UI 设计功能。

    UI 类(如您的自定义 UI 类与 3 EditText)不应该被序列化,因为 UI 类往往会随着时间而改变,这不是模式。您应该只存储/序列化表示 UI 状态的数据/对象,而不是 UI 对象本身。

    我将我的 SharedPrefs 保存在 onStop() 中并在 onCreate() 中恢复它 我正在使用 Gson/Json 进行存储。在 99,9% 中,一切都很好,但是 在最近更新后,一些用户报告了这个问题。

    假设,较新版本的 UI 类包含一个额外的成员变量。现在,在较新版本中序列化将提供与以前版本不同的 JSON 字符串。因此,您的 UI 逻辑可能会发生冲突。

    解决方法

    在这种情况下,您应该将的 ArrayList 设为具有 3 个字符串字段(arg1、arg2、arg3)和 getter/setter 的自定义类,然后使用 Gson 或任何其他库序列化/反序列化此 ArrayList .请注意,以下示例是基本的,并不完美,因为没有提供相关代码。

    onCreate() 中,使用此数据初始化 UI 组件。例如:

    // Retrieve data and initialize custom data holder by deserializing stored json
    CustomObj customObj = gson.get(typeToken, str);
    // Use this data to initialize UI components
    customUiObj.editText1.setText(customObj.arg1);
    customUiObj.editText2.setText(customObj.arg2);
    customUiObj.editText3.setText(customObj.arg3);
    

    onStop() 中,从 UI 组件中检索数据以进行存储。例如:

    String arg1 = customUiObj.editText1.getText().toString();
    String arg2 = customUiObj.editText2.getText().toString();
    String arg3 = customUiObj.editText3.getText().toString();
    // Now, create a data holder object
    CustomObj obj = new CustomObj(arg1, arg2, arg3);
    // Serialize this obj
    String jsonStr = gson.toJson(customObj);
    

    【讨论】:

    • 感谢您的回答,但抱歉可能不够清楚。我的自定义类是数据类而不是自定义 UI 类!我的 UI 没有什么是定制的,一切都是谷歌/​​工厂风格!我存储的数据只是用户输入的Strings,比如名字、姓氏、头衔。但后来更新后,部分用户得到了firstName.setText(lastNameArg)
    • 能否请您提供您序列化/反序列化的自定义类代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2020-02-13
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多