11

に保存しているアプリケーションを開発してusernamepasswordますSharedPreferences。私にとってはすべてがうまく機能しており、値の保存と取得が行われています。しかし、デバイスを再起動するか、アプリを強制終了すると、保存されている値SharedPreferencesがリセットされることがわかりました。アプリを再度起動すると、キーに null 値が表示され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);

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

どんな助けでも大歓迎です。

4

6 に答える 6

10

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

またはのPreferences後に値を保存するオブジェクトがあります。すべての主要な画面メソッドで設定値を読み取ります。LoginRegisteronResume()

ログイン後 (例):

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 に答える
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()、最後に 1 つしかありません。

pref_file_name小文字、先頭に数字なしなど、好きなようにできます。

于 2013-03-12T05:52:03.577 に答える
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 に答える
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 に答える
-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 に答える