【发布时间】:2020-01-13 18:49:32
【问题描述】:
在我的应用中,我使用 SharedPreferences 将一些用户信息(即姓名、体重、身高)保存为键值对。
这些信息用于多项活动。所以我想,不是在每个活动中实现读取/写入 SharedPreferences 的整个过程,我还可以实现一个类“UserData”并定义几个静态方法。所以当我需要一些用户信息或想保存它们时,我只使用“UserData”类的方法,而这个类在后台处理所有的东西。
所以我做了以下事情:
- 类
UserData包含一个私有Map<String,?> - 这张地图是由
getAll()-方法填充的SharedPreferences - 在每个活动的
onCreate()-方法中触发初始化 - 通过
getValue(String key)-方法将值(针对每种可能的类型)提供给定义的键 - 写入(新)信息应通过 setter 方法完成
- 要写回共享首选项,有保存功能
但现在我有很多问题:
getAll()方法 我希望getAll()会从 SharedPreferences 中读取所有键值对。所以我希望,初始化后data将包含 (String,String)-pairs (i.e. "name";"Max") 以及 (String,Integer)-pairs (i.e. "weight",85)。我说的对吗?获取值 方法是,我如何返回
getValue(String key)中的值是否正确?如何从Map<String,?>或Map.Entry<String,?>这样的定义中获取值类型?向地图添加条目 我不知道如何覆盖或向
data写入新条目。一个想法是,为每种类型(即字符串、整数)创建一个集合方法,我可以保存在 SharedPreferences 中,在此方法中创建一个条目,然后调用一个添加方法。但是这应该是什么样子呢?保存 这个保存功能会正常工作吗?我不太确定。
或者这是一个完全愚蠢的方法? 感谢您的支持。
这是我的 UserData 类
public class UserData {
static private boolean isInit = false;
static private Map<String,?> data = new HashMap<>();
static void initialize(Context context){
if(UserData.isInit){
return;
}
if(context==null){
return;
}
// read data from memory
SharedPreferences pref = context.getSharedPreferences(context.getString(R.string.app_userdata),Context.MODE_PRIVATE);
UserData.data = pref.getAll();
Log.v(TAG,"loaded " + UserData.data.size() +" key-value-pairs into map");
UserData.isInit=true;
}
static void reinitialize(Context context){
UserData.isInit=false;
UserData.initialize(context);
}
static <T> T getValue(String key){
Object value = UserData.data.get(key);
if(value instanceof T){
return (T)value;
}else{
return null;
}
}
static <T> T getValue(String key,T retErr){
T value = getValue(key);
if(value!=null){
return value;
}else{
return retErr;
}
}
static void setString(String key, String str){
}
static void setInteger(String key, Integer i){
}
static private void addElement(Map.Entry<String,?> element){
}
static void save(Context context){
SharedPreferences pref = context.getSharedPreferences(context.getString(R.string.app_userdata),Context.MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
for(Map.Entry<String,?> pair : UserData.data.entrySet()){
Object value = pair.getValue();
if(value instanceof String){
editor.putString(pair.getKey(),value.toString());
}else if(value instanceof Integer){
editor.putInt(pair.getKey(),(Integer)value);
}else if(value instanceof Float){
editor.putFloat(pair.getKey(),(Float) value);
}else if(value instanceof Boolean){
editor.putBoolean(pair.getKey(),(Boolean) value);
}
}
editor.apply();
}
}
示例活动
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UserData.initialize(getApplicationContext());
}
}
【问题讨论】: