username
とpassword
をSharedPreferences
に保存するアプリケーションを開発しています。値の保存と取得はすべて正常に機能しています。しかし、デバイスを再起動するか、アプリを強制終了すると、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値が返されるという問題を述べています。アプリのメモリに永続的に保存できますか?または、私はここで何か間違ったことをしていますか?
どんな助けでもありがたいです。
ログイン画面があり、アプリを閉じたり、破棄したり、電話をかけたりした後、内部画面に「ログイン」したままのようにアプリを表示したいと思いました。
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
が機能するはずなので、値を正しく保存または取得しない可能性がある同様のことを試してください
こんにちは!私のために働いた解決策!
解決策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
_は、小文字、先頭に数字を付けないなど、好きなものにすることができます。
私が以下のようにしたのを見てください。
sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext());
editor = sharedPreferences.edit();
isPaidVerison = sharedPreferences.getInt("isPaidVerison", 0);
editor.putInt("isPaidVerison", 1);
editor.commit();
そして、これはうまくいきます。 データは、アプリを再インストールしないか、データをクリアしないまで、Sharedprefrencesに残ります。
そして、私はこの方法でデータを取得します。
isPaidVerison = sharedPreferences.getInt("isPaidVerison", 0);
保存と取得に同じファイルを使用していることを確認してください。これは私を本当にばかげたように見せました:(
// 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;
}