11

我正在开发一个应用程序,我在其中存储usernamepassword. 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);

到目前为止,一切都很好。我再次说明我的问题,即当我强制关闭或重新启动设备时我得到空值。我们可以将其永久存储在应用程序内存中吗?或者,我在这里做错了什么?

任何帮助将不胜感激。

4

6 回答 6

10

我有一个登录屏幕,并希望在应用程序关闭/销毁/电话/等后,该应用程序在内部屏幕上保持“登录”状态。

我有一个Preferences对象来保存Loginor之后的值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应该可以

于 2013-03-12T05:52:57.163 回答
8

你好 !对我有用的解决方案!

解决方案 1 解决方案 2

解决方案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:

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();

我遇到了和你一样的问题,这对我有用。对于我的整个代码示例,请参见

于 2015-11-25T07:24:55.487 回答
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可以是任何你想要的,小写字母,开头没有数字等。

于 2013-03-12T05:52:03.577 回答
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);
于 2013-03-12T05:45:17.567 回答
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;
        }
于 2018-06-29T03:34:13.127 回答
-2

如果您想尝试共享首选项以外的方法,则可以使用文件写入值,然后从中检索值。声明一个文本文件 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();
                }
            }

这将确保即使您的应用程序强制关闭或您的设备重新启动,您仍然可以从文件中读取所需的值。

于 2013-03-12T06:13:29.447 回答