Nasıl kaydedebilirsiniz HashMap için Paylaşılan Tercihler Android'de?
Nasıl kaydedebilirsiniz HashMap için Paylaşılan Tercihler Android'de?
Yanıtlar:
Karmaşık nesnelerin SharedPreference içine yazılmasını önermem. Onun yerine ObjectOutputStream
onu dahili belleğe yazmak için kullanırdım.
File file = new File(getDir("data", MODE_PRIVATE), "map");
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject(map);
outputStream.flush();
outputStream.close();
Kullandığım Gson
dönüştürün HashMap
için String
kendisine tasarrufu sonra veSharedPrefs
private void hashmaptest()
{
//create test hashmap
HashMap<String, String> testHashMap = new HashMap<String, String>();
testHashMap.put("key1", "value1");
testHashMap.put("key2", "value2");
//convert to string using gson
Gson gson = new Gson();
String hashMapString = gson.toJson(testHashMap);
//save in shared prefs
SharedPreferences prefs = getSharedPreferences("test", MODE_PRIVATE);
prefs.edit().putString("hashString", hashMapString).apply();
//get from shared prefs
String storedHashMapString = prefs.getString("hashString", "oopsDintWork");
java.lang.reflect.Type type = new TypeToken<HashMap<String, String>>(){}.getType();
HashMap<String, String> testHashMap2 = gson.fromJson(storedHashMapString, type);
//use values
String toastString = testHashMap2.get("key1") + " | " + testHashMap2.get("key2");
Toast.makeText(this, toastString, Toast.LENGTH_LONG).show();
}
Haritayı tercihe göre kaydetmek ve haritayı tercihe göre yüklemek için basit bir kod parçası yazdım. GSON veya Jackson işlevi gerekmez. Anahtar olarak String ve değer olarak Boolean olan bir harita kullandım.
private void saveMap(Map<String,Boolean> inputMap){
SharedPreferences pSharedPref = getApplicationContext().getSharedPreferences("MyVariables", Context.MODE_PRIVATE);
if (pSharedPref != null){
JSONObject jsonObject = new JSONObject(inputMap);
String jsonString = jsonObject.toString();
Editor editor = pSharedPref.edit();
editor.remove("My_map").commit();
editor.putString("My_map", jsonString);
editor.commit();
}
}
private Map<String,Boolean> loadMap(){
Map<String,Boolean> outputMap = new HashMap<String,Boolean>();
SharedPreferences pSharedPref = getApplicationContext().getSharedPreferences("MyVariables", Context.MODE_PRIVATE);
try{
if (pSharedPref != null){
String jsonString = pSharedPref.getString("My_map", (new JSONObject()).toString());
JSONObject jsonObject = new JSONObject(jsonString);
Iterator<String> keysItr = jsonObject.keys();
while(keysItr.hasNext()) {
String key = keysItr.next();
Boolean value = (Boolean) jsonObject.get(key);
outputMap.put(key, value);
}
}
}catch(Exception e){
e.printStackTrace();
}
return outputMap;
}
getApplicationContext
Basit bir sınıftan nasıl erişebilirim ?
Map<String, String> aMap = new HashMap<String, String>();
aMap.put("key1", "val1");
aMap.put("key2", "val2");
aMap.put("Key3", "val3");
SharedPreferences keyValues = getContext().getSharedPreferences("Your_Shared_Prefs"), Context.MODE_PRIVATE);
SharedPreferences.Editor keyValuesEditor = keyValues.edit();
for (String s : aMap.keySet()) {
keyValuesEditor.putString(s, aMap.get(s));
}
keyValuesEditor.commit();
Vinoj John Hosan'ın cevabının bir yansıması olarak, yanıtı, tek bir anahtar yerine verilerin anahtarına dayalı olarak daha genel eklemelere izin verecek şekilde değiştirdim "My_map"
.
Benim uygulamada, MyApp
benim ise Application
geçersiz kılma sınıfı ve MyApp.getInstance()
geri getirmekte context
.
public static final String USERDATA = "MyVariables";
private static void saveMap(String key, Map<String,String> inputMap){
SharedPreferences pSharedPref = MyApp.getInstance().getSharedPreferences(USERDATA, Context.MODE_PRIVATE);
if (pSharedPref != null){
JSONObject jsonObject = new JSONObject(inputMap);
String jsonString = jsonObject.toString();
SharedPreferences.Editor editor = pSharedPref.edit();
editor.remove(key).commit();
editor.putString(key, jsonString);
editor.commit();
}
}
private static Map<String,String> loadMap(String key){
Map<String,String> outputMap = new HashMap<String,String>();
SharedPreferences pSharedPref = MyApp.getInstance().getSharedPreferences(USERDATA, Context.MODE_PRIVATE);
try{
if (pSharedPref != null){
String jsonString = pSharedPref.getString(key, (new JSONObject()).toString());
JSONObject jsonObject = new JSONObject(jsonString);
Iterator<String> keysItr = jsonObject.keys();
while(keysItr.hasNext()) {
String k = keysItr.next();
String v = (String) jsonObject.get(k);
outputMap.put(k,v);
}
}
}catch(Exception e){
e.printStackTrace();
}
return outputMap;
}
Context
örneğe bir kitaplıktan eriştiğiniz şekilde yaparsınız . Şu diğer SO sorusuna bakın: Bir Android Kitaplık Projesinde uygulamanın bağlamını almak mümkün müdür?
Bunun yerine JSON kullanmayı deneyebilirsiniz.
Tasarruf için
try {
HashMap<Integer, String> hash = new HashMap<>();
JSONArray arr = new JSONArray();
for(Integer index : hash.keySet()) {
JSONObject json = new JSONObject();
json.put("id", index);
json.put("name", hash.get(index));
arr.put(json);
}
getSharedPreferences(INSERT_YOUR_PREF).edit().putString("savedData", arr.toString()).apply();
} catch (JSONException exception) {
// Do something with exception
}
Almak için
try {
String data = getSharedPreferences(INSERT_YOUR_PREF).getString("savedData");
HashMap<Integer, String> hash = new HashMap<>();
JSONArray arr = new JSONArray(data);
for(int i = 0; i < arr.length(); i++) {
JSONObject json = arr.getJSONObject(i);
hash.put(json.getInt("id"), json.getString("name"));
}
} catch (Exception e) {
e.printStackTrace();
}
String converted = new Gson().toJson(map);
SharedPreferences sharedPreferences = getSharedPreferences("sharepref",Context.MODE_PRIVATE);
sharedPreferences.edit().putString("yourkey",converted).commit();
harita -> dize
val jsonString: String = Gson().toJson(map)
preferences.edit().putString("KEY_MAP_SAVE", jsonString).apply()
string -> harita
val jsonString: String = preferences.getString("KEY_MAP_SAVE", JSONObject().toString())
val listType = object : TypeToken<Map<String, String>>() {}.type
return Gson().fromJson(jsonString, listType)
Bunu özel bir paylaşılan tercihler dosyasında kullanabilirsiniz (kaynak: https://developer.android.com/reference/android/content/SharedPreferences.html ):
getAll
API seviye 1 Haritasına eklendi getAll () Tüm değerleri tercihlerden alın.
Bu yöntemle döndürülen koleksiyonu veya içeriğini değiştirmemeniz gerektiğini unutmayın. Bunu yaparsanız, depolanan verilerinizin tutarlılığı garanti edilmez.
Harita döndürür Tercihleri temsil eden anahtar / değer çiftlerinin listesini içeren bir harita döndürür.
Haritanızın yalnızca birkaç düzineden fazla öğeye sahip olmayacağı dar kullanım durumunda, SharedPreferences'ın hemen hemen bir harita gibi çalıştığı ve her girişi kendi anahtarı altında sakladığı gerçeğinden yararlanabilirsiniz:
Map<String, String> map = new HashMap<String, String>();
map.put("color", "red");
map.put("type", "fruit");
map.put("name", "Dinsdale");
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
// OR use a specific pref name
// context.getSharedPreferences("myMegaMap");
for (Map.Entry<String, String> entry : map.entrySet()) {
prefs.edit().putString(entry.getKey(), entry.getValue());
}
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
// OR use a specific pref name
// context.getSharedPreferences("myMegaMap");
prefs.getString("color", "pampa");
Özel bir tercih adı (yani context.getSharedPreferences("myMegaMap")
) kullanmanız durumunda, tüm anahtarları ile de alabilirsiniz.prefs.getAll()
Kişisel değerler SharedPreferences tarafından desteklenen herhangi bir türden olabilir:
String
,int
,long
,float
,boolean
.
Biraz geç olduğunu biliyorum ama umarım okuyan herhangi birine yardımcı olur ..
yani ne yapıyorum
1) HashMap oluşturun ve aşağıdaki gibi veriler ekleyin: -
HashMap hashmapobj = new HashMap();
hashmapobj.put(1001, "I");
hashmapobj.put(1002, "Love");
hashmapobj.put(1003, "Java");
2) Paylaşım kaynağı düzenleyicisine şu şekilde yazın: -
SharedPreferences sharedpreferences = getSharedPreferences(MyPREFERENCES,Context.MODE_PRIVATE);
Editor editor = sharedpreferences.edit();
editor.putStringSet("key", hashmapobj );
editor.apply(); //Note: use commit if u wan to receive response from shp
3) Aşağıdaki gibi verileri okumak: - okunmasını istediğiniz yeni bir sınıfta
HashMap hashmapobj_RECIVE = new HashMap();
SharedPreferences sharedPreferences (MyPREFERENCES,Context.MODE_PRIVATE;
//reading HashMap from sharedPreferences to new empty HashMap object
hashmapobj_RECIVE = sharedpreferences.getStringSet("key", null);