SharedPreferences管理

该博客介绍了如何使用SharedPreferences管理类结合Gson库来存储和获取Java对象。通过将每个Class类映射为SharedPreferences中的一个文件,以键值对的形式存储数据,其中键为类名,值为Gson转换后的JSON字符串。保存数据时会覆盖之前的数据,而获取数据则能根据类名找到对应的SharedPreferences文件并反序列化为原对象。
摘要由CSDN通过智能技术生成

管理SharedPreferences 存储,把每个Class类当成一个文件进行存储,用到了Gson 解析,所以Gradle 先导入gson

保存

DataEntry dataEntry = new DataEntry();
boolean save = SharedPreferencesManager.create(DataEntry.class).save(dataEntry);

获取:

DataEntry obtain = SharedPreferencesManager.obtain(DataEntry.class);

实现:



import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import com.google.gson.Gson;


import java.io.File;
import java.util.HashMap;
import java.util.Map;


import static android.content.Context.MODE_PRIVATE;

/**
 * SharedPreferences 管理类
 * 使用方式:
 * <p>
 *  保存:
 *      DataEntry dataEntry = new DataEntry();
 *      boolean save = SharedPreferencesManager.create(DataEntry.class).save(dataEntry);
 *
 *  获取:
 *   DataEntry obtain = SharedPreferencesManager.obtain(DataEntry.class);
 * <p/>
 *
 * 把一个 Class 类型当做一个文件存储;
 * 其实就是一个xml 文件中 key为 对应类的名称,value 为经Gson 转换后的json 字符串,
 * 然后获取的时候,根据类名找到对应的文件,拿出文件的内容在通过Gson 解析成对应类型
 *
 */
public class SharedPreferencesManager<T> {

    private static final String TAG = "SharedPreferencesManager_Log";
    private static Context sContext = null;

    private static Gson gson = new Gson();

    /**
     * 每个文件对应一个 SharedPreferences
     */
    private SharedPreferences sharedPreferences;

    private static Map<String, SharedPreferencesManager> classCache = new HashMap<>();

    public static void init(Context context) {
        sContext = context.getApplicationContext();
    }

    private SharedPreferencesManager(String clzssName) {
        sharedPreferences = sContext.getSharedPreferences(clzssName, MODE_PRIVATE);
    }

    /**
     * 创建当前保存类的 一个 SharedPreferencesGenerater 对象
     */
    public static <T> SharedPreferencesManager<T> create(Class<T> entityClass) {
        if (sContext == null) {
            throw new RuntimeException("SharedPreferencesGenerater uninitialized , context is null");
        }
        String name = entityClass.getName();
        //查找缓存中有没有对应文件的管理对象
        SharedPreferencesManager spg = classCache.get(name);
        if (spg == null) {
            spg = new SharedPreferencesManager(name);
            classCache.put(name, spg);
        }
        return spg;
    }

    /**
     * 保存,每次调用会覆盖以前的值 ,就算值为null 一样会覆盖
     */
    public boolean save(@NonNull T t) {
        if (sContext == null) {
            throw new RuntimeException("SharedPreferencesGenerater uninitialized , context is null");
        }
        Class<?> EntryClass = t.getClass();
        String name = EntryClass.getName();
        SharedPreferences.Editor edit = sharedPreferences.edit();
        String json = gson.toJson(t);
        edit.putString(name, json);
        edit.commit();
        return true;
    }

    private T getInstace(String name, Class<?> entityClass) {
        String jsonString = sharedPreferences.getString(name, null);
        if (TextUtils.isEmpty(jsonString)) {
            return null;
        } else {
            return (T) gson.fromJson(jsonString, entityClass);
        }
    }


    /**
     * 获取对应类的存储数据
     *
     * @param entityClass
     * @param <T>
     * @return
     */
    public static <T> T obtain(Class<T> entityClass) {
        if (sContext == null) {
            throw new RuntimeException("SharedPreferencesGenerater uninitialized , context is null");
        }
        String name = entityClass.getName();
        SharedPreferencesManager generater;
        boolean b = classCache.containsKey(name);
        if (b) {//缓存中有对应类
            generater = classCache.get(name);
            return (T) generater.getInstace(name, entityClass);
        }
        //判断文件是否存储
        if (isExist(name)) {
            generater = new SharedPreferencesManager(name);
            classCache.put(name, generater);
            return (T) generater.getInstace(name, entityClass);
        }
        return null;
    }

    /**
     * 判断对应的存储文件是否存在
     *
     * @param name
     * @return
     */
    private static boolean isExist(String name) {
        File file = new File("/data/data/" + sContext.getPackageName() + "/shared_prefs", name + ".xml");
        if (file.isFile() && file.exists()) {
            return true;
        }
        return false;
    }

    @SuppressLint("LongLogTag")
    public static <T> void clear(Class<T> entityClass) {
        if (sContext == null) {
            throw new RuntimeException("SharedPreferencesGenerater uninitialized , context is null");
        }
        String name = entityClass.getName();
        boolean b = classCache.containsKey(name);
        if (b) {
            SharedPreferencesManager generater = classCache.get(name);
            generater.sharedPreferences.edit().clear().commit();
            classCache.remove(name);
        } else if (isExist(name)) {
            sContext.getSharedPreferences(name, MODE_PRIVATE).edit().clear().commit();
            File file = new File("/data/data/" + sContext.getPackageName() + "/shared_prefs", name + ".xml");
            file.delete();
        } else {
            Log.d(TAG, "不需要清理");
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值