【问题标题】:android SharedPreferences and Mapandroid SharedPreferences 和 Map
【发布时间】:2020-01-13 18:49:32
【问题描述】:

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

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

所以我做了以下事情:

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

但现在我有很多问题:

  1. getAll() 方法 我希望getAll() 会从 SharedPreferences 中读取所有键值对。所以我希望,初始化后data 将包含 (String,String)-pairs (i.e. "name";"Max") 以及 (String,Integer)-pairs (i.e. "weight",85)。我说的对吗?

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

  3. 向地图添加条目 我不知道如何覆盖或向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();
    }
}

示例活动

public class MainActivity extends AppCompatActivity {

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

        UserData.initialize(getApplicationContext());
    }
}

【问题讨论】:

    标签: java android


    【解决方案1】:

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

    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();
    

    如果您想创建一个执行此操作的类,那很好,但不要将数据添加到地图中。

    【讨论】:

    • 我的方法背后的想法是节省 CPU 负载。我有一个活动 A,用户在其中输入所有数据。在第二个活动 B 中,我使用数据。使用 ShardPreference 我必须首先将所有内容保存在活动 A 中,然后在打开活动 B 时直接再次加载它。我的方法的优点是,我不需要这么多的内存访问。在我的方法中,我只在初始化期间以及当我明确想要保存所有内容时访问内存。我希望你现在能更好地理解我的想法:D
    • @paul_schaefer 再次,你所做的很好......但无论如何,你想使用 SharedPref 给你的东西。不要重新创建轮子。
    猜你喜欢
    • 2012-09-06
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多