java - android 共享首选项和 map

标签 java android

在我的应用程序中,我使用 SharedPreferences 将一些用户信息(即姓名、体重、高度)保存为键值对。

这些信息用于多项 Activity 。所以我想,我也可以实现一个“UserData”类并定义几个静态方法,而不是在每个 Activity 中实现读取/写入 SharedPreferences 的整个过程。因此,当我需要一些用户信息或想要保存它们时,我只使用“UserData”类的方法,并且该类在后台处理所有内容。

所以我做了以下事情:

  • UserData包含私有(private) Map<String,?>
  • 此 map 由 getAll() 填充-SharedPreferences的方法
  • 初始化在 onCreate() 中触发-每个 Activity 中的方法
  • 向定义的键提供值(对于每种可能的类型)是由 getValue(String key) 完成的-方法
  • 写入(新)信息应通过 setter 方法完成
  • 要写回共享首选项,有一个保存功能

但现在我有很多问题:

  1. getAll()方法 我预计,getAll()将从 SharedPreferences 中读取所有键值对。所以我期望在初始化之后 data将包含(字符串,字符串)对(即“名称”;“最大”)以及(字符串,整数)对(即“重量”,85)。我说得对吗?

  2. 获取值 就是这样,我如何返回 getValue(String key) 中的值正确的?如何从这样的 Map<String,?> 获取值类型或Map.Entry<String,?>定义?

  3. 向 map 添加条目 我不知道如何覆盖或写入新条目 data 。一个想法是,为每种类型(即字符串、整数)创建一个设置方法,我可以保存在 SharedPreferences 中,在该方法中创建一个条目,然后调用添加方法。但这应该是什么样子?

  4. 正在保存 这个储蓄功能能正常使用吗?我不太确定。

或者这是一个完全愚蠢的方法吗? 感谢您的支持。

这是我的 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();
    }
}

示例 Activity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        UserData.initialize(getApplicationContext());
    }
}

最佳答案

我认为你正在尝试重新创造轮子。如果您想创建一个自定义类来保存、添加甚至编辑共享首选项,那很好。共享首选项一张 map ,供您使用另一张 map ,对我来说似乎是倒退。

SharedPreferences pref = getApplicationContext().getSharedPreferences("sharedPreferences", 0); // 0 - for private mode

将数据存储到共享首选项中。

Editor editor = pref.edit();
editor.putBoolean("name", "bill");
editor.commit();

获取名称

String name = pref.getString("name", null); //value is null if the key 'name' doesnt exist. you can also put in any string value here

从共享首选项中删除数据

editor.remove("name");
editor.commit();

删除所有内容..

editor.clear();
editor.commit();

如果您想创建一个执行此操作的类,那没问题,但不要将数据添加到 map 中。

关于java - android 共享首选项和 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59722486/

相关文章:

java - JSR-310 - 解析可变长度的秒分数

java - eclipse 无法在大型 android 文件上显示为 "build workspace"...?

java - Collectors.summingInt() 与 mapToInt().sum()

android: aapt.exe 遇到错误

java - 在 java 中使用 Graphics 类时出现 NullPointerException 错误

android - 无法从我的 fragment 中的 ViewModel 观察 LiveData<MutableList<T>>

Java多线程: Passing camera frame to running worker thread

Android通过OTG数据线将文件写入USB

android - 切换按钮的背景不起作用

java - 轻松的 react