【问题标题】:SharedPreferences not to overwrite dataSharedPreferences 不覆盖数据
【发布时间】:2017-03-20 13:51:45
【问题描述】:

我试图在首选项中两次写入具有相同值的列表,当我读回它时,我只得到 1 个结果。 这是我的 SharedPreferences 代码:

public void storeDeviceDetails(final ArrayList<String> deviceDetails) {
        SharedPreferences.Editor editor = context.getSharedPreferences("devicePrefs",Context.MODE_PRIVATE).edit();

        Set<String> set = new LinkedHashSet<>();
        set.addAll(deviceDetails);
        editor.putStringSet("deviceDetails", set);
        editor.apply();
    }

    public ArrayList<String> retrieveDeviceDetails() {
        SharedPreferences prefs = context.getSharedPreferences("devicePrefs", MODE_PRIVATE);
        ArrayList<String> details = null;

        Set<String> set = prefs.getStringSet("deviceDetails", null);

        if (set != null) {
            details = new ArrayList<>(set);
        }

        return details;
    }

我将它写成连续两行的列表 -

MyPrefClass.storeDeviceDetails(myList);
MyPrefClass.storeDeviceDetails(myList);

现在在下一行我做MyPrefClass.retrieveDeviceDetails(); 我只得到它 - [hero2lte, 7.0, hero2ltexx, SM-G935F, samsung]

【问题讨论】:

标签: java android arraylist android-sharedpreferences


【解决方案1】:
Set<String> set = new LinkedHashSet<>();

你正在制作一个新系列,所以它会完全覆盖旧系列。

尝试获取已在 SharedPreferences 中的集合(如果存在),如果不存在则只创建一个新集合。像这样的:

Set<String> set = prefs.getStringSet("deviceDetails", null);

if (set == null) {
    set = new LinkedHashSet<>();
}

此外,正如 cmets 中所述,您要添加两次相同的元素。即使您要修复它,Set 也能保证唯一性,因此它们只会被添加一次。

【讨论】:

  • 好的,实际上我正在尝试将数组列表保存在共享首选项中。我该怎么做?
  • @Cruncher SharedPreferences 不存储列表。如果他需要,他需要使用另一种存储机制。如果 set 对他来说足够了,那么你的答案就有效。
  • @GabeSechan 哦,好吧。存储为 json 数组可能是最好的选择
  • 谢谢大家。我使用了这个stackoverflow.com/questions/7057845/… 而不是 set 并且它有效:)
猜你喜欢
  • 2020-11-05
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2017-04-12
相关资源
最近更新 更多