Android数据存储之SharedPreference

时间:2022-11-14 05:35:22

Android数据存储之SharedPreference

在android开发中,对数据进行存储的操作可谓随处可见,那么为什么要进行数据的存储?其实无非是从两个大的方面来考虑,首先,对于开发者来说,有效地利用Google提供给我们在开发工作中使用数据存储的方式有利于开发效率的提高,使得开发出的软件在性能上达到优化;其次,对于用户来说,节约流量,能够有较好的体验。

那么Google的大神们给我们在android开发工作中提供五种数据存储的方式,分别有:

  • 共享参数
  • 内部存储
  • 外部存储
  • 数据库存储
  • 网络存储

初识SharedPreference

SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置。比如保存我们登录的状态,保存应用的一些设置信息等。SharedPreferences提供了java常规的Long、Int、String等类型数据的保存接口。SharedPreferences提供了java常规的Long、Int、String等类型数据的保存接口。好,这里就简单的介绍了下SharedPreference,接下来咱们写写代码来感知一下SharedPreference的一些简单用法。

操作SharedPreference大约分为以下几个步骤:

  • 获取一个SharedPreference对象
  • 获取一个SharedPreference对象的编辑器对象
  • 使用编辑器对象进行简单数据类型的存储

    ①获取一个SharedPreference对象

    通过调用上下文对象的getSharedPreferences(name,mode);该方法第一个参数是文件名,也就是最终我们将数据存储的文件,第二个参数是存储模式,这里共有四种存储模式:Context.MODE_PRIVATE(表示存储的数据只能在该应用中进行共享)、Context.MODE_WORLD_READABLE(表示存储的数据只能在应用中有读的操作,在android4.2.2版本后过时)、Context.MODE_WORLD_WRITEABLE(表示存储的数据能在应用中有可读可写的操作)、Context.MODE_APPEND(追加)。但一般情况下只使用第一种模式。代码如下:

SharedPreferences sp = getSharedPreferences("config", Context.MODE_PRIVATE);

②获取编辑器对象

SharedPreferences对象本身是不能够对数据进行操作的,需要与它的一个内部接口进行合作才能够对数据进行操作,那么怎么获取一个SharedPreferences的编辑对象尼?通过SharedPreferences的一个实例调用edit()获取,代码如下:

SharedPreferences.Editor edit = sp.edit();

③使用编辑器对象进行简单数据类型的存储

我们只能够对Java中的基本数据类型进行存储操作,比如int、float、boolean、string等,通过调用编辑器对象的putXxx(key,value)方法来进行数据才存储,该方法是通过键值对来进行数据的操作的,简单代码如下:

edit.putBoolean("isLogin",true);
edit.putInt("age",22);
edit.putString("name","darkCode");
edit.commit();

以上就是SharedPreferences的基本用法,但是大家有没有这样一个疑问,这数据到底存储在哪里啊?又是以什么样的形式存储的尼?好,接下来就给大家说说这两个问题。

我们知道android系统是基于Linux的,Andorid是Linux嵌入式开发的,而每一个android应用都有唯一的包名与之对应,我们可以通过一些命令来看看android应用的一些信息,比如查看包名。

这SharedPreferences数据其实是存储在android的data/data/应用包名/shared_prefs/xx.xml,请看下图:
Android数据存储之SharedPreference
Android数据存储之SharedPreference

那么数据是以怎样的格式进行保存的勒?
Android数据存储之SharedPreference

这里相信大家对于SharedPreference有一个比较简单的认识了吧,那接下来我们就来做一个综合的列子,也就是登录时候记住密码的功能。

登录记住密码功能的实现

布局文件我就不给出了,直接上代码和图,o(^▽^)o

首先看看该Demo的整体结构:
Android数据存储之SharedPreference

SPUtils工具类的代码如下:

package com.hc.storageone.utils;

import android.content.Context;
import android.content.SharedPreferences;

/**
* Created by X on 2016/12/12.
*/

public class SPUtils {
private static SharedPreferences sp;
private static SharedPreferences.Editor et;
public static void init(Context context){
sp = context.getSharedPreferences("config",Context.MODE_PRIVATE);
et = sp.edit();
}


public static void putString(String key,String value){
et.putString(key,value).commit();
}

public static String getString(String key){
return sp.getString(key,null);
}

public static void putInt(String key,int value){
et.putInt(key,value).commit();
}

public static int getInt(String key){
return sp.getInt(key,-1);
}

public static void putBoolean(String key,boolean value){
et.putBoolean(key,value).commit();
}

public static boolean getBoolean(String key){
return sp.getBoolean(key,false);
}
}





MyApplication代码如下:

package com.hc.storageone;

import android.app.Application;

import com.hc.storageone.utils.SPUtils;

/**
* Created by X on 2016/12/12.
*/
public class MyApplication extends Application {

@Override
public void onCreate() {
super.onCreate();
SPUtils.init(this);
}

}

MainActivity代码如下:

“`
package com.hc.storageone;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import com.hc.storageone.utils.SPUtils;

/*
* SharedPreference的用法
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText etName;
private EditText etPwd;
private CheckBox cb;
private Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();

    }

private void initView() {

etName = (EditText) findViewById(R.id.et_usename);
etPwd = (EditText) findViewById(R.id.et_pwd);
cb = (CheckBox) findViewById(R.id.cb);
btnLogin = (Button) findViewById(R.id.btn_login);
boolean isSave = SPUtils.getBoolean("isSave");
if (isSave){
etName.setText(SPUtils.getString("name"));
etPwd.setText(SPUtils.getString("pwd"));
cb.setChecked(isSave);
}
btnLogin.setOnClickListener(this);
}

@Override
public void onClick(View view) {
String name = etName.getText().toString().trim();
String pwd = etPwd.getText().toString().trim();
if (TextUtils.isEmpty(name)||TextUtils.isEmpty(pwd)){
Toast.makeText(MainActivity.this,"用户名或密码不能为空",Toast.LENGTH_SHORT).show();
}else {
if (cb.isChecked()){//勾选了checkBox

SPUtils.putString("name",name);
SPUtils.putString("pwd",pwd);
SPUtils.putBoolean("isSave",true);
}else {
SPUtils.putString("name",null);
SPUtils.putString("pwd",null);
SPUtils.putBoolean("isSave",false);
}
}
}

}

最后的运行效果图如下:
第一次登陆该应用:
Android数据存储之SharedPreference

当勾选记住密码,退出应用在进入应用的时候,效果图如下:
Android数据存储之SharedPreference

哈哈,是不是感觉还蛮不错的,我也是个菜鸟,希望大家多多指教,最后勒,给出一句话在这里,当然是引用我最尊敬的郭霖大大的第一行代码封面的话语:“敲击着键盘和挥舞着本本,发誓要把世界写个明明白白”,最后祝大家晚安!