[英]android SharedPreferences and Map
在我的應用程序中,我使用 SharedPreferences 將一些用戶信息(即姓名、體重、身高)保存為鍵值對。
這些信息用於多項活動。 所以我想,除了在每個活動中實現讀取/寫入 SharedPreferences 的整個過程之外,我還可以實現一個“UserData”類並定義幾個靜態方法。 所以當我需要一些用戶信息或想要保存它們時,我只使用“UserData”類的方法,這個類在后台處理所有的東西。
所以我做了以下幾件事:
UserData
包含一個私有Map<String,?>
SharedPreferences
的getAll()
方法填充onCreate()
-Method 中觸發getValue(String key)
-Method 完成但是現在我有很多問題:
我期望getAll()
方法, getAll()
將從 SharedPreferences 讀取所有鍵值對。 所以我希望,初始化后的data
將包含 (String,String)-pairs (ie "name";"Max") 以及 (String,Integer)-pairs (ie "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());
}
}
我認為您正在嘗試重新創建輪子。 如果你想創建一個自定義類來保存、添加甚至編輯共享首選項,那很好。 共享首選項是一張地圖,讓你使用另一張地圖,對我來說似乎是倒退。
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.