【问题标题】:Deleting an item (index) from SharedPreferences从 SharedPreferences 中删除项目(索引)
【发布时间】:2020-11-09 22:18:02
【问题描述】:

我正在保存一个名为 semesterArray 的数组,它是一个 List<String> semesterArray = new ArrayList<>(),在 SharedPreferences 上使用以下方法:

public void saveSemesterArray() {
    StringBuilder stringBuilder = new StringBuilder();

    for(String str: semesterArray) {
        stringBuilder.append(str);
        stringBuilder.append(",");
    }

    SharedPreferences currentSharedPreferences = getSharedPreferences("CURRENT", MODE_PRIVATE);
    SharedPreferences.Editor editor = currentSharedPreferences.edit();
    editor.putString("currentSemesterArray", stringBuilder.toString());

    if(!currentSharedPreferences.getString("currentSemesterArray", "").equals(
            currentSharedPreferences.getString("updatedSemesterArray", ""))) {
        editor.putString("updatedSemesterArray", currentSharedPreferences.getString(
                "currentSemesterArray", "") + stringBuilder.toString());
        editor.apply();
    }
    editor.apply();
}

if 语句 用于更新SharedPreferences,我从this StackOverflow answer 得到了这个想法。现在,下面的方法负责加载刚刚保存的SharedPreferences

public void loadSemesterArray() {
    SharedPreferences sharedPreferences = getSharedPreferences("CURRENT", MODE_PRIVATE);
    String semestersString = sharedPreferences.getString("updatedSemesterArray", "");
    String[] itemsSemesters = semestersString.split(",");
    List<String> items = new ArrayList<String>();
    noDuplicates = new ArrayList<String>();

    for(int i = 0; i < itemsSemesters.length; i++) {
        items.add(itemsSemesters[i]);
    }

    // Removing duplicates from Semesters list
    for(String str: items) {
        if(!noDuplicates.contains(str)) {
            noDuplicates.add(str);
        }
    }

    for(int i = 0; i < noDuplicates.size(); i++) {
        Log.d("NoDuplicatesList", noDuplicates.get(i));
    }
}

我们删除重复的学期,因为saveSemesterArray 方法中的if 语句 将已保存的学期复制到更新的SharedPreferences 中。现在,我想创建一个从SharedPreferences 中删除项目(索引)的方法。例如,如果我有 2020 年春季2020 年夏季2020 年秋季,我可以删除该列表中的任何索引并再次保存,以便更新列表。有没有办法使用SharedPreferences 来完成?如果不是,我应该改用什么?感谢您的帮助。

【问题讨论】:

    标签: java android arraylist sharedpreferences


    【解决方案1】:

    首先,您需要记住,您不是将列表保存到 SharedPreferences,而是保存一个字符串,该字符串以易于反序列化的格式对数据进行序列化。

    其次,将字符串保存到SharedPreferences 是一项非常快速的任务,您实际上不需要检查if 以确保它们不完全相同。

    第三,从该序列化列表中删除项目的唯一方法是:

    1- 对保存的列表进行反序列化。

    2- 删除索引处的项目。

    3- 重新排列列表并再次保存。

    【讨论】:

    • if 语句之所以存在,是因为如果用户在关闭应用程序后添加学期,并且用户之前在上一个会话中添加了学期,那么在上一个会话中添加的学期将丢失,因为SharedPreferences 不更新数据,它只是覆盖它。所以这就是我这样做的原因。无论如何,你能指出我如何反序列化保存的列表的正确方向吗?感谢您的回答!
    【解决方案2】:

    您可以使用 Set 来存储您的列表。将您的字符串数组转换为 Set,然后将该集合保存到

    sharedPreferences.edit().putStringSet(key, value).apply();

    然后查询您的偏好并将其转换为列表,然后您可以通过索引删除任何内容。

    【讨论】:

    • 我不太明白这个答案,你能解释一下吗?谢谢!
    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    相关资源
    最近更新 更多