Общие настройки Константа MODE_APPEND не распознается - PullRequest
1 голос
/ 23 января 2020

Я пытаюсь добавить данные к уже существующим настройкам, но похоже, что константа MODE_APPEND не распознается. Несмотря на ошибку, программа может быть выполнена, но содержание настроек перезаписано.

enter image description here

Я уже искал решение, но не сделал ничего не найти. В чем может быть проблема?

Спасибо.

РЕДАКТИРОВАТЬ

Ожидаемый сценарий:

После первого выполнения программы

array.add("ONE");array.add("TWO");array.add("THREE");
set=new HashSet<String>(array);
editor.putStringSet(key, set);
print(prefs);

Выход

[ОДИН, ДВА, ТРИ]

После второго выполнения программы

array.add("FOUR");array.add("FIVE");array.add("SIX");
set=new HashSet<String>(array);
editor.putStringSet(key, set);
print(prefs);

Выход

[ОДИН, ДВА, ТРИ, ЧЕТЫРЕ, ПЯТЬ, ШЕСТЬ]

1 Ответ

0 голосов
/ 23 января 2020

Добавление к ответу относительно

Предоставленное вами решение не добавляет новые значения. Он перезаписывает их

Ниже приведен набор методов, которые можно использовать для добавления к существующему набору общих настроек.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...