我正在开发一个应用程序,我将username
和password
存储在SharedPreferences
中。所有的东西都适合我,存储以及检索值。但我发现当我重新启动设备或强制关闭应用程序时,SharedPreferences
中存储的值将被重置。当我再次启动我的应用程序时,我在SharedPreferences
键中获得空值。在这里,我正在做的是存储值:
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);
到目前为止,一切正常。 我再次说明我的问题,当我强制关闭或重启我的设备时,我得到空值。我们可以将它永久存储在应用程序内存中吗?或者,我在这里做错了什么?
任何帮助将不胜感激。
答案 0 :(得分:8)
我有一个登录屏幕,希望应用程序看起来好像在应用程序关闭/销毁/电话呼叫等后仍然在内部屏幕上“登录”。
我有一个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 :(得分:6)
嗨! 解决方案对我有用!
解决方案1:
Intent myIntent = new Intent(this,Q1.class);
解决方案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)*/ 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 :(得分:1)
更改为:
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()
次呼叫,这就是最后只有一个呼叫的原因。
pref_file_name
可以是你想要的任何东西,小写字母,开头没有数字等等。
答案 3 :(得分:0)
请参阅下面的内容。
sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext());
editor = sharedPreferences.edit();
isPaidVerison = sharedPreferences.getInt("isPaidVerison", 0);
editor.putInt("isPaidVerison", 1);
editor.commit();
这很好用。 数据将保留在Sharedprefrences中,直到不会重新安装应用程序或直到不清除数据为止。
我以这种方式检索数据。
isPaidVerison = sharedPreferences.getInt("isPaidVerison", 0);
答案 4 :(得分: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;
}
答案 5 :(得分:-1)
如果您想尝试除共享首选项之外的方法,那么您可以使用文件来编写值,然后从中检索值。声明文本文件emailLogin.txt并按如下方式使用它来写入数据。
try {
Context context = MainActivity.this;
OutputStreamWriter out=
new OutputStreamWriter(context.openFileOutput(EMAILLOGIN, 0));
out.write(email_text);
out.write("\r\n");
out.write(userIDToken);
out.write("\r\n");
out.write(accessToken);
out.write("\r\n");
out.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
写入文件后,您可以执行以下操作来阅读。
File file = this.getFileStreamPath(EMAILLOGIN);
if(file.exists())
{
try {
InputStream in=openFileInput(NUMBERS);
if (in!=null) {
InputStreamReader tmp=new InputStreamReader(in);
BufferedReader reader=new BufferedReader(tmp);
String str;
String strcount[]= new String[20];
java.util.Arrays.fill(strcount, 0, 10, "");
while ((str = reader.readLine()) != null) {
strcount[linecount]=str;
}
loginEmail = strcount[0];
loginUserId = strcount[1];
loginAccessToken = strcount[2];
in.close();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这将确保即使您的应用程序强制关闭或设备重新启动,您仍然可以从文件中读取所需的值。