android开发过程中的小问题——使用SPUtils工具类获取数据为null值问题

使用SPUtils工具类获取数据为null值问题(SharedPreference)

开发过程中使用SPUtils工具类,有时获取数据正常,有时获取数据为null值的问题,回去查看保存在虚拟机中的sp表单,发现数据都正常。

然后网上搜索各种博客、各种解决方案,却还是没有解决问题,比如:

  1. 每次调用 editor 的 put 函数存放对应数据类型数据时,都需要 apply() 或 commit() 提交修改 原文
    SharedPreferences sp = getSharedPreferences("loginToken", MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    editor.putString("token", userJson.getString("token"));
    editor.putString("username", userJson.getString("username"));
    editor.commit()
    修改为
    SharedPreferences sp = getSharedPreferences("loginToken", MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    editor.putString("token", userJson.getString("token")).commit();
    editor.putString("username", userJson.getString("username")).commit();
  2. SPUtils 工具类里的上下文 context 问题,需要统一上下文(通过创建一个Application,写一个静态获取 context 的方法,这个找不到原文,就简单说一下)
    SharedPreferences sp = context.getSharedPreferences(“share_data”, Context.MODE_PRIVATE);
  3. sp表中存入 null 键问题 原文

这些都不是我的问题所在,我的问题其实很简单,在调用 SPUtils 时,比如我想要获取一个字符串的文件路径

String path = (String) SPUtils.get(“path”,null);

但由于 defaultObj 设为了 null 值,而 SPUtils 里的 get() 函数实现如下:

public static Object get(String key, Object defaultObj) {
    Context context = MyApplication.getAppContext();
    SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);

    if (defaultObj instanceof String) {
        return sp.getString(key, (String) defaultObj);
    } else if (defaultObj instanceof Integer) {
        return sp.getInt(key, (Integer) defaultObj);
    } else if (defaultObj instanceof Boolean) {
        return sp.getBoolean(key, (Boolean) defaultObj);
    } else if (defaultObj instanceof Float) {
        return sp.getFloat(key, (Float) defaultObj);
    } else if (defaultObj instanceof Long) {
        return sp.getLong(key, (Long) defaultObj);
    }
    return null;
}

而 null 值都不属于这几种引用数据类型,所以获取值肯定为 null,因此在调用 get() 函数获取数据时,defaultObj 要设为对应数据类型的值。

写下这个博客记录一下自己的疏忽吧!

发布了2 篇原创文章 · 获赞 0 · 访问量 57
展开阅读全文

怎么只写一个SharedPreferences让它保存多个数据,而不用像下面代码一样写多个SharedPreferences来保存数据

01-30

package com.myedit; import android.app.*; import android.os.*; import android.view.*; import android.widget.*; import android.view.View.*; import android.content.*; public class MainActivity extends Activity { private SharedPreferences sp,spa,spb; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final EditText a1=(EditText)findViewById(R.id.a1); final EditText a2=(EditText)findViewById(R.id.a2); final EditText a3=(EditText)findViewById(R.id.a3); Button a4=(Button)findViewById(R.id.a4); final TextView a5=(TextView)findViewById(R.id.a5); final TextView a6=(TextView)findViewById(R.id.a6); final TextView a7=(TextView)findViewById(R.id.a7); //保存内容 sp=getSharedPreferences("ba",MODE_PRIVATE); spa=getSharedPreferences("bb",MODE_PRIVATE); spb=getSharedPreferences("bc",MODE_PRIVATE); String str=sp.getString("name",""); String s=spa.getString("name",""); String st=spb.getString("name",""); a5.setText(str); a6.setText(s); a7.setText(st); a4.setOnClickListener(new OnClickListener(){ @Override public void onClick(View p1) { // TODO: Implement this method a5.setText(a1.getText().toString()); a6.setText(a2.getText().toString()); a7.setText(a3.getText().toString()); //读取保存内容 sp.edit().putString("name",a5.getText().toString()).commit(); spa.edit().putString("name",a6.getText().toString()).commit(); spb.edit().putString("name",a7.getText().toString()).commit(); } }); } } ![图片](https://img-ask.csdn.net/upload/201601/31/1454195504_381530.png)![图片](https://img-ask.csdn.net/upload/201601/31/1454195543_814123.png)![图片](https://img-ask.csdn.net/upload/201601/31/1454195560_10566.png)![图片](https://img-ask.csdn.net/upload/201601/31/1454195603_566737.png) 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览