SharedPreferences管理

it2026-04-22  5

管理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, "不需要清理"); } } }
最新回复(0)