Эффективное сохранение нескольких EditTexts в одном действии с SharedPreferences - PullRequest
0 голосов
/ 11 ноября 2018

Я нашел ответы на похожие вопросы, но у меня не получилось ни одного.
Q1: Сохранение нескольких EditText после закрытия программы
Q2: Сохранить последний текст из Edittext и восстановить его после onDestroy

В моем случае речь идет о ~ 50 EditTexts. С вопросом Q2 я понял, как сохранить один отдельный EditText, но как только я скопирую код для различных EditTexts (и использую разные параметры), при перезапуске каждого EditText появится одно и то же слово.

public static final String LAST_TEXT1 = "";
public static final String LAST_TEXT2 = "";
public EditText myEditText1, myEditText2;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.myactivity);

    myEditText1= (EditText)findViewById(R.id.myEditText1);
    final SharedPreferences pref1= PreferenceManager.getDefaultSharedPreferences(this);
    myEditText1.setText(pref.getString(LAST_TEXT1, ""));
    myEditText1.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

            pref.edit().putString(LAST_TEXT1, s.toString()).commit();


        }
    });

    myEditText2= (EditText)findViewById(R.id.myEditText2);
    final SharedPreferences pref2= PreferenceManager.getDefaultSharedPreferences(this);
    myEditText2.setText(pref.getString(LAST_TEXT2, ""));
    myEditText2.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

            pref.edit().putString(LAST_TEXT2, s.toString()).commit();


        }
    });
}

По сути, это несколько раз при изменении всех параметров. (pref, myEditText, LAST_TEXT) Но все различные EditTexts (например, myEditText1 и myEditText2) будут при перезапуске отображать одно и то же слово.

Есть ли эффективный способ сохранить все это содержимое?
Будет ли лучший способ сохранить строки в таблице (я новичок) Если не существует «эффективного» способа сохранить все эти EditTexts, как я могу изменить свой код, чтобы он правильно сохранил данные?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

1. SharedPreference сохраняет данные в паре ключ-значение. Вы сохраняете данные для ключа и при необходимости используете этот же ключ для восстановления значения, даже если приложение закрыто.

В вашем случае вы используете две переменные для хранения строковых ключей: LAST_TEXT1 и LAST_TEXT2. Но, к сожалению, оба имеют одинаковое значение , "" или пустую строку. Поскольку оба ключа технически одинаковы, вы получаете одинаковый результат. Определите эти два ключа, чтобы получить разные результаты:

public static final String LAST_TEXT1 = "LAST_TEXT1";
public static final String LAST_TEXT2 = "LAST_TEXT2";

2. SharedPreference используется для простых и коротких значений ключей. Если ваши значения длиннее, чем несколько слов, я предлагаю использовать Sqlite Database или аналогичные методы хранения данных на долгое время.

0 голосов
/ 11 ноября 2018

Исходя из вашего кода, вы используете один и тот же ключ для всех EditText, и вот что он вам возвращает:

public static final String LAST_TEXT1 = "";
public static final String LAST_TEXT2 = "";

Здесь LAST_TEXT1 и LAST_TEXT2 равны. SharedPreferences - опция хранения на основе ключа / значения. Если вы хотите сохранить разные значения для всех ваших правок, используйте разные клавиши. И я бы порекомендовал, а не пустые строки.

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

Содержимое EditText2 заменит содержимое EditText1 в ваших предпочтениях, поскольку вы используете тот же ключ.

И когда вы попытаетесь получить ваш контент, будет показано соответствующее значение "". LAST_TEXT1 и LAST_TEXT2 являются здесь просто переменными. Ключи - это то, что содержится в переменной.

Надеюсь, это поможет.

...