【问题标题】:How can I make SharedPreferences to update the data instead of overwriting the data and losing part of it?如何使 SharedPreferences 更新数据而不是覆盖数据并丢失部分数据?
【发布时间】:2020-11-05 12:02:36
【问题描述】:

我正在使用以下代码将ArrayList<String> 保存到SharedPreferences

StringBuilder stringBuilder = new StringBuilder();

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

    SharedPreferences sharedPreferences = getSharedPreferences("PREFERENCES", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString("semesterArray", stringBuilder.toString());
    editor.apply();

这在某种程度上完成了工作,因为它按预期保存了ArrayList<String>,并且当重新启动应用程序时,添加的Semesters 仍按我希望的方式存储在ArrayList<String> 中。但是如果我在重新启动应用程序后添加更多Semesters,则保存的Semesters 将被覆盖,并且我会丢失之前保存的Semesters。有没有办法SharedPreferences 可以更新而不是覆盖?如果不是,我应该向哪个方向存储这些Semesters?感谢您的帮助!

【问题讨论】:

  • 在您的情况下,您需要使用 sqlite 或其他数据库..
  • 我可以知道我需要这样做的原因吗?
  • 我猜 sharedpreference 不会保留旧条目,它会用新数据更新它们,我猜 sharedpreferences 仅用于简单存储数据,因为您可能会考虑使用 sqlite db 或 room db 在存储数据方面也很有效
  • @JaimeMiranda 因为根据设计 sharedpreference 会覆盖数据
  • 不知道。如您所见,我是 Android 开发的新手,我真的很努力保存数据。谢谢!

标签: java android arraylist sharedpreferences


【解决方案1】:

正如我在评论中提到的,使用 sharedPrefences 更新或插入新值不是一个好习惯,但如果你想使用 sharedPrefences,我会给你一个解决方案

你能做的是:

  1. 创建名为 current 的 prefrence 以保存字符串的值
  2. 创建另一个名为 new 的首选项,以保存新数据后 检查它是否不等于当前。

你会以这样的代码结束:

 sharedPreferences = getSharedPreferences("shared",MODE_PRIVATE);
        editor = sharedPreferences.edit();
        String text = "first text";
        editor.putString("current",text);
        if (!sharedPreferences.getString("current","").equals(sharedPreferences.getString("new","")))
        {
            editor.putString("new",sharedPreferences.getString("current","") + text );
            editor.commit();

        }
        editor.commit();

第一次保存后的结果:sharedPreferences.getString("current","") 将返回“一些文本”并且 sharedPreferences.getString("new","") 将 返回“”

将“第一个文本”更改为“新文本”后的结果: sharedPreferences.getString("current","") 将返回“新文本”和 sharedPreferences.getString("new","") 将返回 "first text new 文字”

如何使用它:

  if sharedPreferences.getString("new","") equals ""
your data is not updated  use sharedPreferences.getString("current","")  
else  your data is updated so use sharedPreferences.getString("new","")

【讨论】:

  • 我在我的代码中实现了这个解决方案,它实际上是在复制项目。例如,当我添加另一个学期时,我添加了 (Summer 2020),现在列表是 Summer 2020、Summer 2020,并且添加了新项目。知道为什么会发生这种情况吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2020-10-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多