Android的数据存储方式之一——SharedPreferences

Android存储方式有使用SharedPreferences存储数据;文件存储数据;SQLite数据库存储数据;使用ContentProvider存储数据;网络存储数据。

首先说明SharedPreferences存储方式,它是 Android提供的用来存储一些简单配置信息的一种机制,例如:登录用户的用户名与密码。其采用了Map数据结构来存储数据,以键值的方式存储,可以简单的读取与写入。SharedPreferences存储文件的目录是/data/data/Package Name/Shared_Pref,安卓手机root后可以查看。

1、得到SharedPreferences对象
2、调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
3、向SharedPreferences.Editor对象中添加数据。
4、调用commit方法将添加的数据提交。

public SharedPreferences getSharedPreferences(String name, int mode) {
        return mBase.getSharedPreferences(name, mode);
    }

name为本组件的配置文件名( 自己定义,也就是一个文件名)
mode为操作模式,默认的模式为0或MODE_PRIVATE,还可以使用MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE

mode指定为MODE_PRIVATE,则该配置文件只能被自己的应用程序访问。
mode指定为MODE_WORLD_READABLE,则该配置文件除了自己访问外还可以被其它应该程序读取。
mode指定为MODE_WORLD_WRITEABLE,则该配置文件除了自己访问外还可以被其它应该程序读取和写入

现在比较通用的是将SharePreferences的使用封装成一个工具类SPUtil,代码如下:

package com.ada.packageapplication;

import android.content.Context;
import android.content.SharedPreferences;
 
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

/**
 * Created by Ada on 2017/6/20.
 */

public class SPUtil {
    private static String FILE_NAME="Ada_SharePreferences";

    private SPUtil() {
        throw new Error("Do not need instantiate");
    }

    /**
     *保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
     * @param context
     * @param key
     * @param value
     */
    public static void saveData(Context context, String key, Object value) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = sp.edit();
        if(value instanceof Boolean) {
            edit.putBoolean(key, ((Boolean)value).booleanValue());
        } else if(value instanceof String) {
            edit.putString(key, (String)value);
        } else if(value instanceof Integer) {
            edit.putInt(key, ((Integer)value).intValue());
        } else if(value instanceof Float) {
            edit.putFloat(key, ((Float)value).floatValue());
        } else if(value instanceof Long) {
            edit.putLong(key, ((Long)value).longValue());
        }

        SP_Util.SharedPreferencesCompat.apply(edit);
    }

    /**
     * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
     *
     * @param context
     * @param key
     * @param defaultObject
     * @return
     */
    public static Object getData(Context context, String key, Object defaultObject)
    {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);

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

    /**
     * 移除某个key值已经对应的值
     * @param context
     * @param key
     */
    public static void removeData(Context context, String key) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = sp.edit();
        edit.remove(key);
        SP_Util.SharedPreferencesCompat.apply(edit);
    }

    /**
     * 清除所有数据
     * @param context
     */
    public static void clearData(Context context) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = sp.edit();
        edit.clear();
        SP_Util.SharedPreferencesCompat.apply(edit);
    }

    /**
     * 查询某个key是否已经存在
     * @param context
     * @param key
     * @return
     */
    public static boolean containsData(Context context, String key) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        return sp.contains(key);
    }

    /**
     * 返回所有的键值对
     *
     * @param context
     * @return
     */
    public static Map<String, ?> getAll(Context context) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        return sp.getAll();
    }

    /**
     * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
     *
     * @author zhy
     *
     */
    private static class SharedPreferencesCompat {
        private static final Method mApplyMethod = findApplyMethod();

        private SharedPreferencesCompat() {
        }

        private static Method findApplyMethod() {
            try {
                Class e = SharedPreferences.Editor.class;
                return e.getMethod("apply", new Class[0]);
            } catch (Exception var1) {
                var1.printStackTrace();
                return null;
            }
        }

        public static void apply(SharedPreferences.Editor editor) {
            try {
                if(mApplyMethod != null) {
                    mApplyMethod.invoke(editor, new Object[0]);
                    return;
                }
            } catch (IllegalAccessException var2) {
                var2.printStackTrace();
            } catch (InvocationTargetException var3) {
                var3.printStackTrace();
            }

            editor.commit();
        }
    }

}

使用时直接调用SPUtil进行数据的存储和读取

SPUtil.saveData(this,"isRemember",cbxRemember.isChecked());
SPUtil.saveData(this,"userName",userName);
SPUtil.saveData(this,"password",password);
boolean isRemember= (boolean) SPUtil.getData(this,"isRemember",false);
String userName= (String) SPUtil.getData(this,"userName","");
String password= (String) SPUtil.getData(this,"password","");


使用场景:记住密码,代码https://github.com/adadong/SharedPreferencesDemo.git

其他参考链接http://blog.csdn.net/crazy__chen/article/details/47026845



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值