当前位置: 首页 > 知识库问答 >
问题:

SharedReferences保存,不会在下一次启动时持续

姬昀
2023-03-14

我的Storyteller类与共享首选项交互。

它从共享首选项加载一个字符串集,默认值包含22个字符串,保存在其<代码>章节 变量中。

当一个"完成"事件在程序的后面发生时,Storyteller会从章节中删除一个String,然后将其提交给Shared首选项。

我的日志显示最初加载了22个字符串,然后删除并提交到编辑器后加载了21个字符串。

当我再次运行程序时,加载的是22章,而不是预期的21章。

  private Set<String> chapters;

    protected Storyteller(Context c) {
        buffer = "";
        choices = new JSONArray();

        SharedPreferences sharedPref = c.getSharedPreferences(c.getString(R.string.pref_key), Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();

        chapters = sharedPref.getStringSet("chapters", new HashSet<String>());
        Log.v("sip", chapters.toString());
        Log.v("sip-loaded", String.valueOf(chapters.size()));

        if (chapters.isEmpty()) {
            Log.v("sip", "saving vignettes");
            ArrayList<String> names = vignettes();
            for (int i = 0; i < names.size(); i++) {
                String name = names.get(i);
                chapters.add(name);
            }
            editor.putStringSet(c.getString(R.string.chapters), chapters);
            editor.commit();
        }
        Log.v("sip", String.valueOf(chapters.size()));
    }




public void complete(String chapter, Context c) {
    chapters.remove(chapter);
    SharedPreferences sharedPref = c.getSharedPreferences(c.getString(R.string.pref_key), Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putStringSet(c.getString(R.string.chapters), chapters);
    editor.commit();
    Log.v("sip", String.valueOf(chapters.size()));
    chapters = sharedPref.getStringSet("chapters", new HashSet<String>());
    Log.v("sip", String.valueOf(chapters.size()));
}

第一次运行的日志:

12-10 15:24:27.161 3241-3241/? V/sip-loaded: 22
12-10 15:24:27.161 3241-3241/? V/sip: 22
12-10 15:24:27.161 3241-3241/? V/sip-storyloaded: Story loaded
12-10 15:24:37.409 3241-3241/coffeechoices.quantumproductions.com.choicescoffee V/sip: 21
12-10 15:24:37.409 3241-3241/coffeechoices.quantumproductions.com.choicescoffee V/sip: 21
12-10 15:24:37.409 

第二次运行的日志:

12-10 15:25:34.097 3307-3307/coffeechoices.quantumproductions.com.choicescoffee V/sip-loaded: 22
12-10 15:25:34.097 3307-3307/coffeechoices.quantumproductions.com.choicescoffee V/sip: 22
12-10 15:25:34.098 3307-3307/coffeechoices.quantumproductions.com.choicescoffee V/sip-storyloaded: Story loaded

编辑:

getString(R.string.chapters)是,请参阅字符串文件:

<resources>
    <string name="app_name">choices.coffee</string>
    <string name="pref_key">choices.coffee</string>
    <string name="chapters">chapters</string>
</resources>

我试着使用“chapters”和getString,结果是一样的。

请注意,在我保存了complete函数后,我可以从文件中读取数据,并且它显示了正确的数量21。当我重新启动时,它是22,但我创建数据集fresh的日志(仅在集为空时发生)没有被调用。

共有2个答案

安承教
2023-03-14

调用。clear()

SharedPreferences sharedPref = c.getSharedPreferences(c.getString(R.string.pref_key), Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.clear();

允许它正确保存。

司徒志强
2023-03-14

您正在使用两个不同的键:R.string.chapters"章节"

我假设它们不等于同一个字符串。也可以只使用一个键值进行切换。

编辑:

您不应直接根据SharedReference文档更改章节。getStringSet():

请注意,您不能修改此调用返回的设置实例。如果您这样做,存储数据的一致性就不能得到保证,您修改实例的能力也不能得到保证。

 类似资料:
  • 我在共享偏好设置中出错。当我通过手机上的活动应用菜单关闭应用程序时,我的数据不会保存。只有当我通过完成亲和()关闭应用程序时,数据才会保存。帮助我修复错误。 }'

  • 当我打开下面的测试时,chrome一直在运行几次,导致测试失败。我已经调试了两天,找不到问题。你能指出我在哪里出错吗,任何帮助都将不胜感激! WebDriver ChromeDrive类 Object类 测试类

  • 我在努力打字 当我保存一个实体时,有时我的数据会更新,有时不会。完全相同的请求第一次不会起作用,但第二次会起作用。我使用保存()更新和插入。插入时一切都好。 以下是我的代码(使用NestJS键入表单): == == == == 当我在save()之后找到()时,我的用户地址不会更新,而我从Mongo收到了modifiedCount 1。如果我重复这个请求,这一次它是有效的。。。 有什么想法吗?

  • 如果必须保证一个方法在spring boot应用程序启动时只执行一次,那么的最佳替代方案是什么?

  • 我正在使用netty编写一个网络游戏服务器,并打算使用keep alive来提高性能<如果我为boss和worker executor使用CachedThreadPool,那么服务器对于保持活动和非保持活动连接都可以正常工作<但是如果我使用FixedThreadPool(1),一个用于boss,一个用于worker,第一个响应会发送给客户端,但如果浏览器使用该连接发送第二个请求,它将被阻止并在服务

  • 3.2 第一次启动 第一次启动后,会进入如下页面: 第一次启动没有任何数据,请按照提示初始化数据。 由于站点信息依赖Nginx集群信息、集群信息,所以请完成站点依赖的Nginx集群信息、业务集群信息配置后,再配置站点信息。