Обновление SharedPreference для получения свежих данных при входе пользователя - PullRequest
0 голосов
/ 13 декабря 2018

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

Вот мой код:

public class SharedPrefManager {
private static final String SHARED_PREF_NAME = "my_shared_preff";
private static SharedPrefManager mInstance;
private Context mCtx;
private SharedPrefManager(Context mCtx) {
    this.mCtx = mCtx;
}
public static synchronized SharedPrefManager getInstance(Context mCtx) {
    if (mInstance == null) {
        mInstance = new SharedPrefManager(mCtx);
    }
    return mInstance;
}
public void saveUser(User user) {
    SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt("id", user.getId());
    editor.putString("email", user.getEmail());
    editor.putString("firstname", user.getFirstName());
    editor.putString("lastname", user.getLastName());
    editor.putString("companyname", user.getCompanyName());
    editor.putString("address1", user.getAddress1());
    editor.putString("city", user.getCity());
    editor.putString("state", user.getState());
    editor.putString("postcode", user.getPostcode());
    editor.putString("country", user.getCountry());
    editor.putString("phonenumber", user.getPhonenumber());
    editor.putString("status", user.getStatus());
    editor.putInt("currency", user.getCurrency());
    editor.putString("credit", user.getCredit());
    editor.putString("language", user.getLanguage());
    editor.putInt("email_verified", user.getEmail_verified());
    editor.apply();
}

public boolean isLoggedIn() {
    SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
    return sharedPreferences.getInt("id", -1) != -1;
}
public User getUser() {
    SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
    return new User(
            sharedPreferences.getInt("id", -1),
            sharedPreferences.getString("email", null),
            sharedPreferences.getString("firstname", null),
            sharedPreferences.getString("lastname", null),
            sharedPreferences.getString("companyname", null),
            sharedPreferences.getString("address1", null),
            sharedPreferences.getString("city", null),
            sharedPreferences.getString("state", null),
            sharedPreferences.getString("postcode", null),
            sharedPreferences.getString("country", null),
            sharedPreferences.getString("phonenumber", null),
            sharedPreferences.getString("status", null),
            sharedPreferences.getInt("currency", -1),
            sharedPreferences.getString("credit", null),
            sharedPreferences.getString("language", null),
            sharedPreferences.getInt("email_verified", 1)
    );
}

public Emails getEmails() {
    SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
    return new Emails(
            sharedPreferences.getString("subject", null),
            sharedPreferences.getString("message", null)

    );
}

public void clear() {
    SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.clear();
    editor.apply();
}

}

Есть ли способ добавить в SharedPreference операцию фонового обновления, посредством которой код извлекает и обновляет сохраненные данные без выхода пользователя из системы?

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Вы можете зарегистрировать слушателя, используя sharedprefs.registerOnSharedPreferenceChangeListener.

Также вы пишете много стандартного кода для чтения / записи в общих настройках.Вы можете использовать что-то вроде this .

0 голосов
/ 17 декабря 2018

Вы можете использовать PowerPreference для хранения объекта

https://github.com/AliEsaAssadi/Android-Power-Preference

Сохранить данные

public void saveUser(User user) {

  PowerPreference.defult().put("USER_KEY",user);

}

Получить данные

public User getUser() {

 return PowerPreference.defult().getObject("USER_KEY", User.class, new User());

}

Очистить

public void clear() {

  PowerPreference.defult().clear();

}

Удалить

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

PowerPreference.defult().remove("USER_KEY");
0 голосов
/ 13 декабря 2018

SharedPreferences уже делает это.Вместо того, чтобы читать все из SharedPreferences в getUser и getEmails, вы должны читать индивидуальное предпочтение, когда вам нужно его значение.Всякий раз, когда вы читаете значение из объекта SharedPreferences, вы каждый раз получаете его последнее значение.

Один из способов сделать это - избавиться от класса SharedPrefManager, дать свой UserКласс SharedPreferences член и реализовать User.getId для вызова sharedPrefs.getInt("id") и т. д.

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