SharedPreferences介绍

一句话概括

SharedPreferences在android中主要以xml文件的方式保存较小的键值对。

1.SharedPreferences介绍

在android中,保存较小的android键值对,主要可以保存的数据类型有:

  • String
  • Float
  • Boolean
  • Int
  • Long
  • StringSet Set集合,泛型为String 2.保存形式

SharedPreferences以xml的形式保存在 data/data/包名/shared_prefs 这个目录下, 具体情况大概是以下情况:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>

<map> <string name="name">nick</string> <int name="age" value="18" /> <float name="high" value="1.8" /> <boolean name="isBoy" value="true" /> <long name="ID" value="123456789999999" /> <set name="setString"> <string>1</string> <string>2</string> <string>3</string> <string>4</string> </set> </map> 3.存储方式

一个超级简单的例子:

SharedPreferences sp = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putString("key", "value");
edit.apply();

解释: getPreferences(int mode)这个方法是Context的方法,所以可以在activity中使用, 可以理解为打算要创建一个名字为:当前Activity名字.xml 的文件, sp.edit();这是向当前的sp要一个编辑器,以便给它加入键值对。 Editor的用法类似map,以put的形式赋值。 edit.apply(),表示提交。完成这一步,xml才会真正的创建。

关于获取SharedPreferences其实有2种方式:

getPreferences(int mode) getSharedPreferences(String name, int mode) mode这个参数我们待会讲,我们先看有name这个参数和没有name这个参数有什么区别 name这个参数其实就是给xml文件取名字,例如以下代码:

[@Override](https://my.oschina.net/u/1162528)
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getPreferences(MODE_PRIVATE).edit().apply();
    getSharedPreferences("haha", MODE_PRIVATE).edit().apply();

}

那么在文件夹下面就会创建这2个xml文件 这里写图片描述

mode这个参数,也就是使用模式,有4种使用模式

MODE_PRIVATE MODE_APPEND MODE_WORLD_READABLE MODE_WORLD_WRITEABLE 但是下面两种已经过时了,Google官方不推荐使用,因为不安全,别人就可以读写这个文件了。 我们来看看前面两种。官方解释: MODE_PRIVATE:该模式下,创建的文件只能被本应用访问 MODE_APPEND:该模式下,如果文件已经存在,则将数据写入现有文件的结尾,而不是擦除它.。 其实我感觉这两个模式没啥区别。

接下来我们看看提交的方式,其实也有两种:

edit.apply(); edit.commit(); 这两种提交方式是有区别的 apply()这种的效率要高些,而且没有返回值。提交了后不需要关心是否提交成功,反正老子提交了。 commit()这种的效率就要低一些的,有一个boolean返回值,true就提交成功了,false就提交失败了,如果有多个edit同时提交,系统只认最后一个。

4.获取方式

SharedPreferences的获取方式更加简单,上代码:

SharedPreferences sp = getPreferences(MODE_PRIVATE);
String string = sp.getString("key", "default");

你没看错,就只有两行代码,getString(“key”,”default”),第一次参数为保存时候的key值,第二个参数为默认值,当没有获取到数据的时候,会启动默认值。这是防止自己傻逼忘了存储值就开始取值了。

5.方式技巧

以上我已经把基本的使用当时都说了,现在该说说,平时我怎么用他了。

首先写一个工具类,代码有点多,我就直接拷了:

package com.qxf.archer.sharedpreferencesdemo;

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

/**

public class SharedPreferencesUtils {

/**
 * 上下文
 */
private static Context mContext;

/**
 * 初始化SharedPreferences,必须使用该方法
 */
public static void init(Context context) {
    mContext = context;
}

/**
 * 抛出异常
 */
private static void throwInit(){
    if (mContext == null) {
        throw new NullPointerException("在使用该方法前,需要使用init()方法,推荐将init()放入Application中");
    }
}

/**
 * 插入字符串
 * [@param](https://my.oschina.net/u/2303379) name 文件名
 * [@param](https://my.oschina.net/u/2303379) key key
 * [@param](https://my.oschina.net/u/2303379) value 值
 */
public static void putString(String name, String key, String value) {
    throwInit();
    SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
    SharedPreferences.Editor edit = sp.edit();
    edit.putString(key, value);
    edit.apply();
}

/**
 * 获取字符串
 * @param name 文件名
 * @param key key
 * @param defaultValue 没获取到时的默认值
 * @return 字符串
 */
public static String getString(String name, String key, String defaultValue) {
    throwInit();
    SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
    return sp.getString(key, defaultValue);
}

/**
 * 插入整型
 * @param name 文件名
 * @param key key
 * @param value 值
 */
public static void putInt(String name, String key, int value) {
    throwInit();
    SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
    SharedPreferences.Editor edit = sp.edit();
    edit.putInt(key, value);
    edit.apply();
}

/**
 * 获取整型
 * @param name 文件名
 * @param key key
 * @param defaultValue 没获取到时的默认值
 * @return 整型
 */
public static int getInt(String name, String key, int defaultValue) {
    throwInit();
    SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
    return sp.getInt(key, defaultValue);
}

/**
 * 插入浮点型
 * @param name 文件名
 * @param key key
 * @param value 值
 */
public static void putFloat(String name, String key, float value) {
    throwInit();
    SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
    SharedPreferences.Editor edit = sp.edit();
    edit.putFloat(key, value);
    edit.apply();
}

/**
 * 获取浮点型
 * @param name 文件名
 * @param key key
 * @param defaultValue 没获取到时的默认值
 * @return 浮点型
 */
public static float getFloat(String name, String key, float defaultValue) {
    throwInit();
    SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
    return sp.getFloat(key, defaultValue);
}

/**
 * 插入Long型
 * @param name 文件名
 * @param key key
 * @param value 值
 */
public static void putLong(String name, String key, long value) {
    throwInit();
    SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
    SharedPreferences.Editor edit = sp.edit();
    edit.putLong(key, value);
    edit.apply();
}

/**
 * 获取长整型
 * @param name 文件名
 * @param key key
 * @param defaultValue 没获取到时的默认值
 * @return 长整型
 */
public static float getLong(String name, String key, long defaultValue) {
    throwInit();
    SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
    return sp.getLong(key, defaultValue);
}

/**
 * 插入boolean型
 * @param name 文件名
 * @param key key
 * @param value 值
 */
public static void putBoolean(String name, String key, boolean value) {
    throwInit();
    SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
    SharedPreferences.Editor edit = sp.edit();
    edit.putBoolean(key, value);
    edit.apply();
}

/**
 * 获取布尔型
 * @param name 文件名
 * @param key key
 * @param defaultValue 没获取到时的默认值
 * @return 布尔型
 */
public static boolean getBoolean(String name, String key, boolean defaultValue) {
    throwInit();
    SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
    return sp.getBoolean(key, defaultValue);
}

} 使用方式: 1.首先创建一个MyApplication,继承自Application,并且在清单文件里面声明好,如下:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:name=".MyApplication"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

2.在自己创建的application中的oncreate方法中写如下:

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

3.创建一个Constants类,主要记录常量,可以在里面规定文件名字,key什么的,为的是保证自己不把key写错,例如:

public class Constants {

/**
 * xml文件名
 */
public static final String SHARD_NAME = "a1";

public static final String SHARD_NAME_STRING = "string";
public static final String SHARD_NAME_INT = "int";
public static final String SHARD_NAME_FLOAT = "float";
public static final String SHARD_NAME_LONG = "long";
public static final String SHARD_NAME_BOOLEAN = "boolean";

} 接下来就可以开始使用了: 布局,今天他长这样: 这里写图片描述 然后,MainActivity.java

package com.qxf.archer.sharedpreferencesdemo;

import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Button jump;
private Button addString;
private Button addInt;
private Button addLong;
private Button addFloat;
private Button addBoolean;
private Button checkAll;
private TextView show;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();

    SharedPreferencesUtils.getBoolean("asdas", "as", true);

}

private void initView() {
    addString = (Button) findViewById(R.id.addString);
    addInt = (Button) findViewById(R.id.addInt);
    addLong = (Button) findViewById(R.id.addLong);
    addFloat = (Button) findViewById(R.id.addFloat);
    addBoolean = (Button) findViewById(R.id.addBoolean);
    checkAll = (Button) findViewById(R.id.checkAll);
    show = (TextView) findViewById(R.id.show);

    addString.setOnClickListener(this);
    addInt.setOnClickListener(this);
    addLong.setOnClickListener(this);
    addFloat.setOnClickListener(this);
    addBoolean.setOnClickListener(this);
    checkAll.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.addString:
            SharedPreferencesUtils.putString(Constants.SHARD_NAME, 
                Constants.SHARD_NAME_STRING, "字符串");
            break;
        case R.id.addInt:
            SharedPreferencesUtils.putInt(Constants.SHARD_NAME, 
                Constants.SHARD_NAME_INT, 10);
            break;
        case R.id.addLong:
            SharedPreferencesUtils.putLong(Constants.SHARD_NAME, 
                Constants.SHARD_NAME_LONG, 12345678999999L);

            break;
        case R.id.addFloat:
            SharedPreferencesUtils.putFloat(Constants.SHARD_NAME, 
                Constants.SHARD_NAME_FLOAT, 3.14f);

            break;
        case R.id.addBoolean:
            SharedPreferencesUtils.putBoolean(Constants.SHARD_NAME, 
                Constants.SHARD_NAME_BOOLEAN, true);

            break;
        case R.id.checkAll:

            String aString = SharedPreferencesUtils
                .getString(Constants.SHARD_NAME, Constants.SHARD_NAME_STRING, "默认值");
            int anInt = SharedPreferencesUtils
                .getInt(Constants.SHARD_NAME, Constants.SHARD_NAME_INT, -1);
            float aLong = SharedPreferencesUtils
                .getLong(Constants.SHARD_NAME, Constants.SHARD_NAME_LONG, -1L);
            float aFloat = SharedPreferencesUtils
                .getFloat(Constants.SHARD_NAME, Constants.SHARD_NAME_FLOAT, -1.0f);
            boolean aBoolean = SharedPreferencesUtils.getBoolean(Constants
                .SHARD_NAME, Constants.SHARD_NAME_BOOLEAN, false);

            String result = aString + "\n" + anInt 
                + "\n" + aLong + "\n" + aFloat + "\n" + aBoolean;

            show.setText(result);

            break;
    }
}

} 如果要添加key就直接在constants这个类里面添加就行了,是不是很简单,虽然工具类很长,但是以后使用起来就特别简单了,特别是要经常使用sharedpreferences的时候。

源码下载:http://download.csdn.net/detail/it_xf/9735337

转载于:https://my.oschina.net/wlsblogs/blog/1594777

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值