Добавление к ответу относительно
Предоставленное вами решение не добавляет новые значения. Он перезаписывает их
Ниже приведен набор методов, которые можно использовать для добавления к существующему набору общих настроек.
public void appendSharedPreference(SharedPreferences sharedPreferences,String key, Object o) {
SharedPreferences.Editor e = sharedPreferences.edit();
for (Map.Entry<String,?> entry: sharedPreferences.getAll().entrySet()) {
sharedPrefPut(e,entry.getKey(),entry.getValue());
}
sharedPrefPut(e,key,o);
e.commit();
}
public void sharedPrefPut(SharedPreferences.Editor e, String key, Object o) {
if (o instanceof Boolean) e.putBoolean(key,(Boolean) o);
if (o instanceof String) e.putString(key,(String) o);
if (o instanceof Integer) e.putInt(key,(Integer) o);
if (o instanceof Long) e.putLong(key,(Long) o);
if (o instanceof Float) e.putFloat(key,(Float) o);
if (o instanceof Set) e.putStringSet(key,(Set<String>) o);
}
Пример использования этого в Activity , это: -
SharedPreferences.Editor e1 = this.getSharedPreferences("test",0).edit();
e1.putInt("KEY1",100);
e1.putString("KEY2","MYDATA");
e1.commit();
for (Map.Entry<String,?> e: this.getSharedPreferences("test",0).getAll().entrySet()) {
Log.d("SPINITIAL","Key is " + e.getKey() + " Value is " + e.getValue());
}
appendSharedPreference(this.getSharedPreferences("test",0),"KEYAPPENDANOTHER","SomeOtherData");
for (Map.Entry<String,?> e: this.getSharedPreferences("test",0).getAll().entrySet()) {
Log.d("SPEND","Key is " + e.getKey() + " Value is " + e.getValue());
}
Журнал, полученный из вышеупомянутого
До
D / SPINITIAL: ключ - KEY2 Значение - MYDATA
D / SPINITIAL: ключ KEY1 Значение 100
После
D / SPEND: ключ KEY2 Значение MYDATA
D / SPEND: Ключ - KEY1 Значение - 100
D / SPEND: Ключ - KEYAPPENDANOTHER Значение - SomeOtherData
Конечно, чрезмерное использование / злоупотребление SharedPreferences может привести к снижению производительности
Редактировать о редактировании
Можно использовать метод (тонкое изменение), например
public void replaceSharedPreference(SharedPreferences sharedPreferences, String key, Object o) {
SharedPreferences.Editor e = sharedPreferences.edit();
for (Map.Entry<String, ?> entry: sharedPreferences.getAll().entrySet()) {
if (entry.getKey().equals(key)) {
sharedPrefPut(e,entry.getKey(),o);
} else {
sharedPrefPut(e,entry.getKey(),entry.getValue());
}
}
}
Поэтому вместо добавления нового он заменит существующий. Переданный объект должен быть построен, и по вашему требованию он должен быть извлечен и добавлен к существующему объекту.
Примером на основе ваших требований может быть: -
ArrayList<String> array = new ArrayList<>();
array.add("ONE");array.add("TWO");array.add("THREE");
HashSet<String> set = new HashSet<>(array);
SharedPreferences.Editor e1 = this.getSharedPreferences("test",0).edit();
e1.putInt("KEY1",100);
e1.putString("KEY2","MYDATA");
e1.putStringSet("KEY3",set);
e1.commit();
for (Map.Entry<String,?> e: this.getSharedPreferences("test",0).getAll().entrySet()) {
Log.d("SPINITIAL","Key is " + e.getKey() + " Value is " + e.getValue());
}
//appendSharedPreference(this.getSharedPreferences("test",0),"KEYAPPENDANOTHER","SomeOtherData");
ArrayList<String> appendset = new ArrayList<>();
appendset.add("FOUR");
appendset.add("FIVE");
appendset.add("SIX");
HashSet<String> oldset = null;
if ((oldset = (HashSet<String>) this.getSharedPreferences("test",0).getStringSet("KEY3",null)) != null) {
oldset.addAll(appendset);
replaceSharedPreference(this.getSharedPreferences("test",0),"KEY3",oldset);
}
for (Map.Entry<String,?> e: this.getSharedPreferences("test",0).getAll().entrySet()) {
Log.d("SPEND","Key is " + e.getKey() + " Value is " + e.getValue());
}
Если заказ пожалуйста, обратите внимание
Это не дает никаких гарантий относительно порядка итерации набора; в частности, это не гарантирует, что порядок останется постоянным с течением времени. Класс HashSet