Shared Preferences reset data when app is force closed or device is restarted

后端 未结 6 1886
暖寄归人
暖寄归人 2020-11-30 11:21

I\'m developing an application in which I\'m storing username and password in SharedPreferences. All things are working fine for me, s

相关标签:
6条回答
  • 2020-11-30 12:01

    Change to:

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

    NOTE: This is untested and from memory, so there may be an error.

    You want to minimise the .commit() calls, which is why there is only one at the end.

    pref_file_name can be whatever you want, with lower case letters, no numbers at start, etc.

    0 讨论(0)
  • 2020-11-30 12:05

    See I have done like below.

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

    And this works fine. Data will remain in Sharedprefrences till will do not reinstall the app or till will d'not clear data.

    And I retrive data this way.

           isPaidVerison = sharedPreferences.getInt("isPaidVerison", 0);
    
    0 讨论(0)
  • 2020-11-30 12:07

    If you want to try an approach other than shared preferences then you can use a file to write the values and then retrieve the values from it. Declare a text file emailLogin.txt and use it as follows to write the data.

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

    After writing to the file, you can do the following to read from it.

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

    This will ensure that even when your app force closes or if your device reboots, you can still read the required values from the file.

    0 讨论(0)
  • 2020-11-30 12:08

    Make sure that you are using the same file to save and retrieve. This made me look really dumb :(

    // 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 讨论(0)
  • 2020-11-30 12:15

    Hi ! Solution that worked for me!

    Solution 1 Solution 2

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

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

    I have had exactly same problem like yours and this worked for me. For my whole code sample see

    0 讨论(0)
  • 2020-11-30 12:16

    I have a login screen and wanted the app to appear as if it's remained "logged in" at the internal screen after the app is closed/destroyed/phone call/etc.

    I have a Preferences Object to save values following Login or Register. I read preference values in all the key screen onResume() methods.

    After login (for example):

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

    Within onResume() of Activities: (ie, within internal screens)

    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", "");
    

    Note. I have application "global" variables, ie, application.currentSessionId, you can just substitute your variables

    Try something similar maybe your not saving or retrieving the values correctly because SharePreferences should work

    0 讨论(0)
提交回复
热议问题