如何将ProfileModel与SharedPreference关联以读取存储的用户数据
问题解答
原生SharedPreferences未内置类似Firebase的自动数据-模型映射API,可通过以下两种方案实现需求:
方案1:手动封装映射逻辑(无需额外依赖)
这是最轻量化的实现方式,直接读取SP中存储的字段后赋值给模型类即可,示例代码如下:
// 读取SP存储的date字段 SharedPreferences dataUser = getApplicationContext().getSharedPreferences("userData", Context.MODE_PRIVATE); // 第二个参数为读取失败时返回的默认值,可按需调整 String savedDate = dataUser.getString("date", ""); // 实例化ProfileModel ProfileModel model = new ProfileModel(savedDate); // 给文本控件赋值 dateTxt.setText(model.getDate());
如果模型类后续新增字段,可将读取逻辑封装为ProfileModel的静态方法提升复用性:
// 在ProfileModel类中新增静态方法 public static ProfileModel loadFromSharedPreferences(Context context){ SharedPreferences sp = context.getSharedPreferences("userData", Context.MODE_PRIVATE); String date = sp.getString("date", ""); // 后续新增字段只需在此处补充对应读取逻辑即可 return new ProfileModel(date); }
调用时仅需一行代码即可拿到模型实例:
ProfileModel model = ProfileModel.loadFromSharedPreferences(getApplicationContext());
方案2:通过Gson实现自动序列化/反序列化(字段较多时更高效)
如果你的项目已经引入Gson,可直接将整个ProfileModel对象序列化为JSON字符串存入SP,读取时直接反序列化为模型对象,无需手动写字段映射逻辑,和Firebase的使用体验接近。
首先调整存储逻辑:
ProfileModel model = new ProfileModel(dateString); // 将模型序列化为JSON字符串 String modelJson = new Gson().toJson(model); SharedPreferences dataUser = getApplicationContext().getSharedPreferences("userData", Context.MODE_PRIVATE); SharedPreferences.Editor editor = dataUser.edit(); editor.putString("profile_data", modelJson); // 推荐用apply替代commit,异步写入不会阻塞主线程 editor.apply();
读取时直接反序列化即可:
SharedPreferences dataUser = getApplicationContext().getSharedPreferences("userData", Context.MODE_PRIVATE); String modelJson = dataUser.getString("profile_data", ""); ProfileModel model = new Gson().fromJson(modelJson, ProfileModel.class); // 增加判空逻辑避免空指针异常 if(model != null){ dateTxt.setText(model.getDate()); }
内容的提问来源于stack exchange,提问作者FloFlaFli
相关产品推荐
相关产品推荐

