android SharedPreferences 的问题,读不到数据。

尤德尼拉 2014-12-18 11:11:30
		SharedPreferences share = getSharedPreferences("name", 0);
Editor e = share.edit();

//方法a,在第一句输出的时候读不到数据。
String a = "abc_cc";
System.err.println(share.getString(a, "默认结果"));//此句似乎没有执行,没有任何输出,错误...
//但是第二次执行的时候,会正常输出。
e.putString(a, "修改的结果");
e.commit();
System.err.println(share.getString(a, "默认结果"));//输出:修改的结果,正常

//方法b,一切正常
System.err.println(share.getString("abc_cc", "默认结果"));//输出:默认结果,正常
e.putString("abc_cc", "修改的结果");
e.commit();
System.err.println(share.getString("abc_cc", "默认结果"));//输出:修改的结果,正常

//求解,为什么方法a不行?



这是getString的源码
    String getString(String key, String defValue);

/**
* Retrieve a set of String values from the preferences.
*
* <p>Note that you <em>must not</em> modify the set instance returned
* by this call. The consistency of the stored data is not guaranteed
* if you do, nor is your ability to modify the instance at all.
*
* @param key The name of the preference to retrieve.
* @param defValues Values to return if this preference does not exist.
*
* @return Returns the preference values if they exist, or defValues.
* Throws ClassCastException if there is a preference with this name
* that is not a Set.
*
* @throws ClassCastException
*/
...全文
826 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
莫卢俊德 2016-05-25
  • 打赏
  • 举报
回复
8楼正解,用MODE_MULTI_PROCESS就ok了,不过MODE_MULTI_PROCESS, @deprecated MODE_MULTI_PROCESS does not work reliably in * some versions of Android, and furthermore does not provide any * mechanism for reconciling concurrent modifications across * processes. Applications should not attempt to use it. Instead, * they should use an explicit cross-process data management * approach such as {@link android.content.ContentProvider ContentProvider}. */
574904233 2015-11-13
  • 打赏
  • 举报
回复
遇见了类似的问题 , 求解 ???
「已注销」 2014-12-18
  • 打赏
  • 举报
回复
写法有点问题,读的时候不需要edit,直接getString就行了。 把Editor e = share.edit();移到 a方法的 e.putString之前
「已注销」 2014-12-18
  • 打赏
  • 举报
回复
引用 7 楼 hemingnor916 的回复:
[quote=引用 6 楼 WantD 的回复:] 用你的代码稍加修改,测试一切正常:

        SharedPreferences share = getSharedPreferences("name", 0);
         
        //方法a,在第一句输出的时候读不到数据。
        String a = "abc_cc";
        System.err.println(share.getString(a, "默认结果1"));//此句似乎没有执行,没有任何输出,错误...
                                                            //但是第二次执行的时候,会正常输出。
        Editor e = share.edit();
        e.putString(a, "修改的结果2");
        e.commit();
        System.err.println(share.getString(a, "默认结果3"));//输出:修改的结果,正常
         
        //方法b,一切正常
        System.err.println(share.getString("abc_cc", "默认结果4"));//输出:默认结果,正常
        e.putString("abc_cc", "修改的结果5");
        e.commit();
        System.err.println(share.getString("abc_cc", "默认结果6"));//输出:修改的结果,正常
你的代码确实是可以的,我自己的好像也可以(不知道为什么,发帖之前测试了一天都不行)。 后来我回到工程里,再测试自己的方法,还是不行。 我们的工程自己写了个helper类,那个类第一次读取的时候还是不行。 不管怎样,还是谢谢你。 我再研究下我们的helper类。[/quote] 你之前的方法之所以不行是因为你, edit了,就好比如你打开了一个文件,你又想删除它,他正在被另一个进程调用一样。 如果你要想实现这种操作,需要改打开文件的方式,用Mode.mult这种方式
尤德尼拉 2014-12-18
  • 打赏
  • 举报
回复
引用 6 楼 WantD 的回复:
用你的代码稍加修改,测试一切正常:

        SharedPreferences share = getSharedPreferences("name", 0);
         
        //方法a,在第一句输出的时候读不到数据。
        String a = "abc_cc";
        System.err.println(share.getString(a, "默认结果1"));//此句似乎没有执行,没有任何输出,错误...
                                                            //但是第二次执行的时候,会正常输出。
        Editor e = share.edit();
        e.putString(a, "修改的结果2");
        e.commit();
        System.err.println(share.getString(a, "默认结果3"));//输出:修改的结果,正常
         
        //方法b,一切正常
        System.err.println(share.getString("abc_cc", "默认结果4"));//输出:默认结果,正常
        e.putString("abc_cc", "修改的结果5");
        e.commit();
        System.err.println(share.getString("abc_cc", "默认结果6"));//输出:修改的结果,正常
你的代码确实是可以的,我自己的好像也可以(不知道为什么,发帖之前测试了一天都不行)。 后来我回到工程里,再测试自己的方法,还是不行。 我们的工程自己写了个helper类,那个类第一次读取的时候还是不行。 不管怎样,还是谢谢你。 我再研究下我们的helper类。
「已注销」 2014-12-18
  • 打赏
  • 举报
回复

用你的代码稍加修改,测试一切正常:


SharedPreferences share = getSharedPreferences("name", 0);

//方法a,在第一句输出的时候读不到数据。
String a = "abc_cc";
System.err.println(share.getString(a, "默认结果1"));//此句似乎没有执行,没有任何输出,错误...
//但是第二次执行的时候,会正常输出。
Editor e = share.edit();
e.putString(a, "修改的结果2");
e.commit();
System.err.println(share.getString(a, "默认结果3"));//输出:修改的结果,正常

//方法b,一切正常
System.err.println(share.getString("abc_cc", "默认结果4"));//输出:默认结果,正常
e.putString("abc_cc", "修改的结果5");
e.commit();
System.err.println(share.getString("abc_cc", "默认结果6"));//输出:修改的结果,正常
尤德尼拉 2014-12-18
  • 打赏
  • 举报
回复
引用 4 楼 WantD 的回复:
贴出完整代码
这就是完整代码了,复制到onCreate下面,可以运行了。
「已注销」 2014-12-18
  • 打赏
  • 举报
回复
贴出完整代码
尤德尼拉 2014-12-18
  • 打赏
  • 举报
回复
问题是我在share.getString里用了变量,就读不了了。 但我的工程会有很多地方用到这个功能,不用变量不好管理。
尤德尼拉 2014-12-18
  • 打赏
  • 举报
回复
引用 1 楼 WantD 的回复:
写法有点问题,读的时候不需要edit,直接getString就行了。 把Editor e = share.edit();移到 a方法的 e.putString之前
也是不行的,我直接把方法a给屏蔽了,方法b就可以正常执行。

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧