Wie kann ich eine HashMap in den freigegebenen Einstellungen in Android speichern ?
Wie kann ich eine HashMap in den freigegebenen Einstellungen in Android speichern ?
Antworten:
Ich würde nicht empfehlen, komplexe Objekte in SharedPreference zu schreiben. Stattdessen würde ich es verwenden ObjectOutputStream
, um es in den internen Speicher zu schreiben.
File file = new File(getDir("data", MODE_PRIVATE), "map");
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject(map);
outputStream.flush();
outputStream.close();
Ich benutze Gson
zu konvertieren HashMap
zu String
und dann speichern Sie es aufSharedPrefs
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();
}
Ich habe einen einfachen Code geschrieben, um die Karte in der Präferenz zu speichern und die Karte aus der Präferenz zu laden. Keine GSON- oder Jackson-Funktionen erforderlich. Ich habe gerade eine Map mit String als Schlüssel und Boolean als Wert verwendet.
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
von einer einfachen Klasse aus zugreifen ?
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();
Als Ableger der Antwort von Vinoj John Hosan habe ich die Antwort geändert, um allgemeinere Einfügungen basierend auf dem Schlüssel der Daten anstelle eines einzelnen Schlüssels wie zu ermöglichen "My_map"
.
In meiner Implementierung MyApp
ist meine Application
Override-Klasse und MyApp.getInstance()
handelt, um die zurückzugeben 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
von einer Bibliothek aus auf die Instanz zugreifen würden . Schauen Sie sich diese andere SO-Frage an: Ist es möglich, den Anwendungskontext in einem Android-Bibliotheksprojekt abzurufen?
Sie können stattdessen versuchen, JSON zu verwenden.
Zum Speichern
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
}
Zum bekommen
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();
Verwenden von PowerPreference .
Daten speichern
HashMap<String, Object> hashMap = new HashMap<String, Object>();
PowerPreference.getDefaultFile().put("key",hashMap);
Daten lesen
HashMap<String, Object> value = PowerPreference.getDefaultFile().getMap("key", HashMap.class, String.class, Object.class);
map -> string
val jsonString: String = Gson().toJson(map)
preferences.edit().putString("KEY_MAP_SAVE", jsonString).apply()
Zeichenfolge -> Karte
val jsonString: String = preferences.getString("KEY_MAP_SAVE", JSONObject().toString())
val listType = object : TypeToken<Map<String, String>>() {}.type
return Gson().fromJson(jsonString, listType)
Sie können dies in einer dedizierten Datei mit freigegebenen Einstellungen verwenden (Quelle: https://developer.android.com/reference/android/content/SharedPreferences.html ):
Nimm alle
hinzugefügt in API Level 1 Map getAll () Ruft alle Werte aus den Einstellungen ab.
Beachten Sie, dass Sie die von dieser Methode zurückgegebene Sammlung oder deren Inhalt nicht ändern dürfen. Die Konsistenz Ihrer gespeicherten Daten kann in diesem Fall nicht garantiert werden.
Rückgabe der Karte Gibt eine Karte zurück, die eine Liste von Schlüssel- / Wertpaaren enthält, die die Einstellungen darstellen.
Für den engen Anwendungsfall, in dem Ihre Karte nur ein paar Dutzend Elemente enthält, können Sie die Tatsache nutzen, dass SharedPreferences wie eine Karte funktioniert, und einfach jeden Eintrag unter einem eigenen Schlüssel speichern:
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");
Wenn Sie einen benutzerdefinierten Voreinstellungsnamen (dh context.getSharedPreferences("myMegaMap")
) verwenden, können Sie auch alle Schlüssel mit abrufenprefs.getAll()
Ihre Werte können von jeder Art von SharedPreferences unterstützt werden:
String
,int
,long
,float
,boolean
.
Ich weiß, dass es etwas zu spät ist, aber ich hoffe, dass dies für jede Lesung hilfreich sein kann.
Also was ich tue ist
1) Erstellen Sie HashMap und fügen Sie Daten hinzu wie: -
HashMap hashmapobj = new HashMap();
hashmapobj.put(1001, "I");
hashmapobj.put(1002, "Love");
hashmapobj.put(1003, "Java");
2) Schreiben Sie es in den Shareprefrences-Editor wie: -
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) Lesen von Daten wie: - in einer neuen Klasse, in der sie gelesen werden sollen
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);