【问题标题】:Setting and fetching a StringSet from SharedPreferences?从 SharedPreferences 设置和获取 StringSet?
【发布时间】:2015-05-25 13:15:44
【问题描述】:

我正在构建一个 Android 应用程序。我想在首选项中存储一组字符串,以便根据他们的登录信息跟踪谁使用了该应用程序。

我不想使用数据库,所以我知道我应该使用 SharedPreferences 来存储登录人员的列表。我希望能够重置此列表,以便将个人登录数据保留为字符串,而不是因为 StringSets 不是一个选项。使用单独的字符串意味着我必须保留这些字符串的另一个列表,以便我可以在需要时清理它们。 StringSet 更容易维护。

这是我到目前为止所做的:

    //this is my preferences variable
    SharedPreferences prefs = getSharedPreferences("packageName", MODE_PRIVATE);

    //I create a StringSet then add elements to it
    Set<String> set = new HashSet<String>();
    
    set.add("test 1");
    set.add("test 2");
    set.add("test 3");

    //I edit the prefs and add my string set and label it as "List"
    prefs.edit().putStringSet("List", set);

    //I commit the edit I made
    prefs.edit().commit();

    //I create another Set, then I fetch List from my prefs file
    Set<String> fetch = prefs.getStringSet("List", null);

    //I then convert it to an Array List and try to see if I got the values 
    List<String> list = new ArrayList<String>(fetch);

    for(int i = 0 ; i < list.size() ; i++){
        Log.d("fetching values", "fetch value " + list.get(i));
    }

但是,事实证明Set&lt;String&gt; fetch 为空,并且我遇到空指针异常,这可能是因为我没有正确存储或获取我的 StringSet。

【问题讨论】:

  • 您在将字符串集放入首选项后忘记了 apply()。

标签: android sharedpreferences


【解决方案1】:

您可以将结果写入 JSON 字符串并将它们存储在共享首选项中,如下所示:https://stackoverflow.com/a/5968562/617044

但是,如果您选择沿着您当前的路线走,那么您将不得不存储一个包裹。

如另一个答案所述;如果您正在为 API 11+ 构建,则可以使用 putStringSet()、getStringSet()。

【讨论】:

    【解决方案2】:

    首先创建一个编辑器对象:

    SharedPreferences.Editor editor = prefs.edit();
    

    并使用编辑器对象来存储和获取您的字符串集,如下所示:

    editor.putStringSet("List", set);
    editor.apply();
    
    Set<String> fetch = editor.getStringSet("List", null);
    

    【讨论】:

    • 当然,如果您正在为 API 11 或更高版本构建,这比我的回答要容易:)
    • 好吧,我会尝试这个解决方案,因为我正在为 API 11++ 构建。申请和提交有什么区别?
    • 好的,这行得通。但我确实有一个问题。添加 test 、 test 2 和 test 3 后,我再次获取它们。但是,在获取时,似乎顺序错误。我知道我可以通过在获取后排序来解决这个问题,但是有没有办法确保对集合的写入按顺序执行?谢谢!
    • 我在我的手机上知道但我猜有一个像'set.add(0, "test 1");'这样的方法set.add(1, "测试 2");等,每个值都有一个键
    • 申请和提交的区别:stackoverflow.com/questions/5960678/…
    猜你喜欢
    • 2022-01-21
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多