web-dev-qa-db-ja.com

共有設定は、アプリが強制的に閉じられたとき、またはデバイスが再起動されたときにデータをリセットします

usernamepasswordSharedPreferencesに保存するアプリケーションを開発しています。値の保存と取得はすべて正常に機能しています。しかし、デバイスを再起動するか、アプリを強制終了すると、SharedPreferencesに保存されている値がリセットされることがわかりました。また、アプリを再度起動すると、SharedPreferencesキーにnull値が表示されます。これが、値を格納するために私が行っていることです。

SharedPreferences emailLoginSP;

emailLoginSP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
emailLoginSP.edit().putString("prefEmailId", email_text).commit();
emailLoginSP.edit().putString("prefUserId", userIDToken).commit();
emailLoginSP.edit().putString("prefAccess_token", accessToken).commit();

Intent i = new Intent(LoginWithEmail.this,UserInfoActivity.class);
i.putExtra("acess_token", accessToken);
i.putExtra("user_id", userIDToken);
i.putExtra("emailID", email_text);
startActivity(i);

そして、これは私がそれを検索する方法です:

SharedPreferences emailLoginSP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

loginEmail = emailLoginSP.getString("prefEmailId", null);
loginUserId = emailLoginSP.getString("prefUserId", null);
loginAccessToken = emailLoginSP.getString("prefAccess_token", null);

これまですべてが正常に機能しています。繰り返しますが、デバイスを強制的に閉じるか再起動するとnull値が返されるという問題を述べています。アプリのメモリに永続的に保存できますか?または、私はここで何か間違ったことをしていますか?

どんな助けでもありがたいです。

9
Anupam

ログイン画面があり、アプリを閉じたり、破棄したり、電話をかけたりした後、内部画面に「ログイン」したままのようにアプリを表示したいと思いました。

PreferencesまたはLoginに続く値を保存するためのRegisterオブジェクトがあります。すべてのキー画面のonResume()メソッドで設定値を読み取ります。

ログイン後(例):

SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor editor = app_preferences.edit();
editor.putString("sessionId", application.currentSessionId);
editor.putString("userId", application.currentUserId);
editor.putString("userEmail", application.currentUserEmail);
editor.putString("siteUserId", application.currentSiteUserId);
editor.commit();

アクティビティのonResume()内:(つまり、内部画面内)

SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(activity);
application.currentSessionId = app_preferences.getString("sessionId", "");
application.currentUserId = app_preferences.getString("userId", "");
application.currentUserEmail = app_preferences.getString("userEmail", "");
application.currentSiteUserId = app_preferences.getString("siteUserId", "");

注意。アプリケーションの「グローバル」変数があります。つまり、application.currentSessionId、変数を置き換えることができます

SharePreferencesが機能するはずなので、値を正しく保存または取得しない可能性がある同様のことを試してください

9
wired00

こんにちは!私のために働いた解決策!

ソリューション1ソリューション2

解決策1:解決策1:

  SharedPreferences sharedPreferences = getSharedPreferences("namefile",               
    Context.MODE_PRIVATE);//store or retrieved file "namefile.xml".
    /*or 
   SharedPreferences sharedPreferences    
   =getActivity().getSharedPreferences("namefile", Context.MODE_PRIVATE); 
   (use Shared Preferences in Fragment)*/
   String getValueFromKey = sharedPreferences.getString("yourKey",new   
   String());
   //Log.d("printf:",getValueFromKey );
   getValueFromKey ="Hahaha"; /*  Edit value    
   or Do nothing …… */
   SharedPreferences.Editor editor = sharedPreferences.edit();
   editor.clear(); //[important] Clearing your editor before using it.
   editor.putString("yourKey", getValueFromKey);
   editor.commit();

解決策2:解決策2:

SharedPreferences sharedPreferences = getSharedPreferences("namefile",     
  Context.MODE_PRIVATE);//store or retrieved file "namefile.xml".
/*or 
SharedPreferences sharedPreferences = 
getActivity().getSharedPreferences("namefile", Context.MODE_PRIVATE); 
(use Shared Preferences in Fragment)
*/
Set<String> getListValueFromKey =
sharedPreferences.getStringSet("yourKey",new HashSet<String>());
getListValueFromKey.add("Hahaha");
getListValueFromKey.add("Kakaka");
getListValueFromKey.add("Hohoho");
/*  Add value or Do nothing …… */
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear(); //[important] Clearing your editor before using it.
editor.putStringSet("yourKey", getListValueFromKey);
editor.commit();

私はあなたとまったく同じ問題を抱えていました、そしてこれは私のために働きました。私のコードサンプル全体については、を参照してください。

への変更:

_SharedPreferences emailLoginSP;
SharedPreferences.Editor SPEdit;

emailLoginSP = getSharedPreferences("pref_file_name",MODE_PRIVATE);
SPEdit = emailLoginSP.edit();

SPEdit.putString("prefEmailId", email_text);
SPEdit.putString("prefUserId", userIDToken);
SPEdit.putString("prefAccess_token", accessToken);
SPEdit.commit();
_

注:これはテストされておらず、メモリからのものであるため、エラーが発生する可能性があります。

.commit()呼び出しを最小限に抑えたいので、最後に1つしかありません。

_pref_file_name_は、小文字、先頭に数字を付けないなど、好きなものにすることができます。

1
Tigger

私が以下のようにしたのを見てください。

        sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(getApplicationContext());
        editor = sharedPreferences.edit();
        isPaidVerison = sharedPreferences.getInt("isPaidVerison", 0);


        editor.putInt("isPaidVerison", 1);
        editor.commit();

そして、これはうまくいきます。 データは、アプリを再インストールしないか、データをクリアしないまで、Sharedprefrencesに残ります。

そして、私はこの方法でデータを取得します。

       isPaidVerison = sharedPreferences.getInt("isPaidVerison", 0);
0
Nirali

保存と取得に同じファイルを使用していることを確認してください。これは私を本当にばかげたように見せました:(

// When saving
public SharedPreferences.Editor getEditor(Activity activity, int mode) {
    SharedPreferences sharedPref = activity.getApplicationContext().getSharedPreferences(PreferenceConstants.SWAGGER_USER_PREFS, mode);
    SharedPreferences.Editor editor = sharedPref.edit();
    return editor;
}


// When getting it
    public SharedPreferences getSharedPref(Activity activity, int mode) {
            SharedPreferences sharedPref = activity.getSharedPreferences(PreferenceConstants.SWAGGER_USER_PREFS, mode);
            return sharedPref;
        }
0
Elawry kip