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;
}
}