Android开发,关于SharedPreferences持久性存储对象的实现

Androd提供了3种持久性存储数据的方法,分别是文件存储,SharedPreferences存储,和数据库存储。

1.文件存储采用 openfileoutput()和openfileinput结合 Java流实现,方便快捷,以文件的形式保存在本地。但文本文件只能存储String单类型的数据,对于其他类型不太适用。
2.数据库存储,通过服务器对于数据库的访问,使得数据存储变得安全稳定,持久,核心数据随时可以通过网络获取。但数据存储需要建数据库,建表,SQL语句实现等操作,相对较为麻烦,适合存储数据复杂而重要而共享的数据。不过大量的开源框架弥补了这一缺点。
3.SharedPreferences通过获取 sharedPreferences对象,实例化editor,以键值对的形式,通过 editor.putint(key,data), editor.putString(key,Value)等进行数据存入。以 sp.get(key)的方式读取数据。具体方法如下:

//建立sp的编辑器, 第一个参数是自定义文件名,第二个参数默认
 SharedPreferences.Editor editor = getSharedPreferences(
                ConstantString.sharePreferencesName,MODE_PRIVATE).edit();
 String str = "lallalallallallal";
 editor.putString(key, str);
 editor.apply();  

从sharedPreferences对象中读取数据

//获得指定SP名文件的sharedpeferences对象
 SharedPreferences sp = getSharedPreferences(
 ConstantString.sharePreferencesName,MODE_PRIVATE);
 String getgson = sp.getString(
 key,"failtoGetDataValue");

是不是非常简单,接下来就实现对于对象类型的数据存储实现。
。。。。。。
。。。。。
。。。。
。。。
。。

很遗憾的告知你,sharepreference并没有提供对象类型数据的存储,不过别急,我们可以采用将对象类型数据转化为字符存储,再将字符解析为对象就完美解决了这个问题。那是什么呢?
对咯,就是 json.
我们将对象以json形式存储,再将存储的json解析成对象,就达到了目的。
具体操作如下:
首先我们建立一个FirstActivity,和相关的xml,
它只有一个功能,就是跳转到第二个 SecondActivity;所以FirstActivity的代码我就不写了。

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".EighthActivity">
    <EditText
        android:id="@+id/usename"
        android:hint="账号"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <EditText
        android:id="@+id/password"
        android:hint="密码"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/recover_data"
        android:text="数据复现"
        android:onClick="recoverDataBySP"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

在这里插入图片描述
当我们输入 账号 和 密码 后,按返回键,回到FirstActivity,那么SecondActivity将会被销毁,数据被回收,此时在FirstActivity中再次启动SecondActivity,账号密码自然为空,点击数据复现按钮,实现账号密码再次填充的功能。这个可以运用于“app登录账号密码的记住,app登录过一次下次登录就可以自动登录,无需密码输入”。
SecondActivity.java

public class SecondActivity extends BaseActivity {
     private EditText usename,password;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        init();
    }
    public void init(){
        usename = (EditText)findViewById(R.id.usename);
        password = (EditText)findViewById(R.id.password);

    }
    //建立数据保存方法
    public void save(UserBean userBean){
        //建立sp的编辑器, 第一个参数是自定义文件名,第二个参数默认
        SharedPreferences.Editor editor = getSharedPreferences(
                ConstantString.sharePreferencesName,MODE_PRIVATE).edit();
        //把对象转化为gson,因为share preferences没有提供存储对象的方法,所以要转化gson
        Gson gson = new Gson();
        String changeObjecttoGson = gson.toJson(userBean);
        editor.putString(ConstantString.userBean,changeObjecttoGson);//key
        editor.apply();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        String getusename = usename.getText().toString();
        String getpassword = password.getText().toString();
        UserBean userBean = new UserBean(getusename,getpassword);
        save(userBean);
    }

    //恢复数据,将gson转化回 user Bean对象
    public void recoverDataBySP(View view){
        switch (view.getId()){
            case R.id.recover_data:
                //获得指定SP名文件的sharedpeferences对象
                SharedPreferences sp = getSharedPreferences(ConstantString.sharePreferencesName,MODE_PRIVATE);
                //获得json
                String getgson = sp.getString(ConstantString.userBean,"failureGetJson");
                //将json转化为指定对象
                Gson gson = new Gson();
                Type type = new TypeToken<UserBean>(){}.getType();//获得UserBean对象类型
                UserBean userBean = gson.fromJson(getgson,type);
                usename.setText(userBean.getUsename());
                password.setText(userBean.getPassword());
            default:
                break;
        }
    }
}

UserBean.java

public class UserBean implements Serializable {
    private String usename;
    private String password;
    public UserBean(String c_usename,String c_password){
        this.usename = c_usename;
        this.password = c_password;
    }

    //Ctrl + Shift T  打开 try   catch  finally


    // Alt +  Ins
    public String getUsename() {
        return usename;
    }

    public void setUsename(String usename) {
        this.usename = usename;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值