簡體   English   中英

android SharedPreferences 和 Map

[英]android SharedPreferences and Map

在我的應用程序中,我使用 SharedPreferences 將一些用戶信息(即姓名、體重、身高)保存為鍵值對。

這些信息用於多項活動。 所以我想,除了在每個活動中實現讀取/寫入 SharedPreferences 的整個過程之外,我還可以實現一個“UserData”類並定義幾個靜態方法。 所以當我需要一些用戶信息或想要保存它們時,我只使用“UserData”類的方法,這個類在后台處理所有的東西。

所以我做了以下幾件事:

  • UserData包含一個私有Map<String,?>
  • 該地圖由SharedPreferencesgetAll()方法填充
  • 初始化在每個活動的onCreate() -Method 中觸發
  • 為定義的鍵提供值(對於每種可能的類型)由getValue(String key) -Method 完成
  • 寫入(新)信息應該由 setter 方法完成
  • 寫回共享首選項,有一個保存功能

但是現在我有很多問題:

  1. 我期望getAll()方法, getAll()將從 SharedPreferences 讀取所有鍵值對。 所以我希望,初始化后的data將包含 (String,String)-pairs (ie "name";"Max") 以及 (String,Integer)-pairs (ie "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());
    }
}

我認為您正在嘗試重新創建輪子。 如果你想創建一個自定義類來保存、添加甚至編輯共享首選項,那很好。 共享首選項一張地圖,讓你使用另一張地圖,對我來說似乎是倒退。

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

如果您想創建一個執行此操作的類,那很好,但不要將數據添加到地圖中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM