2016-11-13 9 views
-1

私はSharedPreferencesを実装するクラスを持っていますが、データを保存しようとしたりデータを取得しようとすると、SharedPreferencesは変数を保存していないようです

public class SharedPreferenceManager { 

public SharedPreferenceManager() { 
    super(); 
} 

public static final String FILENAME = "PREFERENCES_FILE"; 

public static void saveData(Context context, String key, String data) 
{ 
    SharedPreferences sharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putString(key, data); 
    editor.apply(); 
} 

public static String getData(Context context, String key){ 
    SharedPreferences sharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE); 
    String data = sharedPreferences.getString(key, null); 
    return data; 
} 

public static void removeData(Context context, String key){ 
    SharedPreferences sharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.remove(key); 

} 
} 

私はデータを保存する場所です:

public class CreateUserActivity extends Activity { 
EditText txtName, txtEmail, txtPassword; 
AlertDialogManager alert = new AlertDialogManager(); 
private String token; 
private SharedPreferenceManager sharedPreferenceManager; 

public void setToken(String token) { 
    this.token = token; 
} 

public String getToken() { 
    return token; 
} 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.create_user_activity); 
    txtName = (EditText) findViewById(R.id.loginName); 
    txtEmail = (EditText) findViewById(R.id.loginEmail); 
    txtPassword = (EditText) findViewById(R.id.loginPassword); 
    sharedPreferenceManager = new SharedPreferenceManager(); 
} 

public void checkCreateUser(View view) throws JSONException { 
    String name = txtName.getText().toString(); 
    String email = txtEmail.getText().toString(); 
    String password = txtPassword.getText().toString(); 
    String token = getToken(); 

    CheckBox checkBox = (CheckBox) findViewById(R.id.login_remember_checkbox); 
    if (name.trim().length() > 0 && password.trim().length() > 0 && email.trim().length() > 0) { 
     JSONObject userObj = new JSONObject(); 
     userObj.put("name", name); 
     userObj.put("email", email); 
     userObj.put("password", password); 
     String jsonDocument = userObj.toString(); 
     PostUserTask put = new PostUserTask(); 
     put.execute("http://api.evang.dk/v2/users", jsonDocument); 
     if (checkBox.isChecked()) { 
      sharedPreferenceManager.saveData(CreateUserActivity.this, "USERNAME", name); 
      sharedPreferenceManager.saveData(CreateUserActivity.this, "EMAIL", email); 
      sharedPreferenceManager.saveData(CreateUserActivity.this, "PASSWORD", password); 
      sharedPreferenceManager.saveData(CreateUserActivity.this, "TOKEN", token); 
     } else { 
      sharedPreferenceManager.removeData(CreateUserActivity.this, "USERNAME"); 
      sharedPreferenceManager.removeData(CreateUserActivity.this, "EMAIL"); 
      sharedPreferenceManager.removeData(CreateUserActivity.this, "PASSWORD"); 
      sharedPreferenceManager.removeData(CreateUserActivity.this, "TOKEN"); 
     } 
    } 
    else 
    { 
     alert.showAlertDialog(CreateUserActivity.this, "Login failed!", "Please enter name, username and password", false); 
    } 
    Intent i = new Intent(getBaseContext(), UserActivity.class); 
    i.putExtra("SESSIONID", token); 
    i.putExtra("NAMEID", name); 
    startActivity(i); 
} 

そして、私はSharedPreferencesのデータ読み込み:saveData(...)に、あなたがeditor.apply()ではなくを使用するので

EditText userNameTxt, passwordTxt, emailTxt; 
SharedPreferenceManager sharedPreferenceManager; 
String token; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 
    Intent intent = getIntent(); 
    userNameTxt = (EditText) findViewById(R.id.userNameLogin); 
    passwordTxt = (EditText) findViewById(R.id.passwordLogin); 
    emailTxt = (EditText) findViewById(R.id.emailLogin); 
    sharedPreferenceManager = new SharedPreferenceManager(); 
    String userName = sharedPreferenceManager.getData(getBaseContext(), "USERNAME"); 
    String email = sharedPreferenceManager.getData(getBaseContext(), "EMAIL"); 
    String password = sharedPreferenceManager.getData(getBaseContext(), "PASSWORD"); 
    token = sharedPreferenceManager.getData(getBaseContext(), "TOKEN"); 
    if(userName != null && email != null && password != null && token != null) 
    { 
     userNameTxt.setText(userName); 
     emailTxt.setText(email); 
     passwordTxt.setText(password); 
    } 
} 
+2

可能な重複)Shared Preferences](http://stackoverflow.com/questions/5960678/whats-the-difference-between-commit-and-apply-in-shared-preference) –

+0

どのようにこのクラスを使用していますか?どこからいつデータを読み書きしていますか? – clownba0t

+0

@ clownba0t詳細については、質問が編集されました。 – kennyYice23

答えて

1
  • editor.commit()、あなたのデータはあなたがそれを読む前にファイルに書き込まれていない可能性があります。 (editor.apply()は非同期であり、すぐにeditor.commit()とは異なり、ディスクに変更を書き込みません)

はこのように、代わりにeditor.commit()を使用してみてください:[コミット()と適用の違いは(何の

public static void saveData(Context context, String key, String data) 
{ 
SharedPreferences sharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = sharedPreferences.edit(); 
editor.putString(key, data); 
editor.commit(); 
} 
+1

これは必ずしも正しいものではありません。これらのクライアントが同じプロセス内にある場合)、また、 'apply'は非同期とみなされますが、非同期のディスクへの変更の書き込みだけです。メモリ内のSharedPreferencesはただちにディスクへの非同期コミットを開始します... " – clownba0t

+1

' SharedPreferences'は** Singleton **で実装されていますので、新しいインスタンスを作成することはできません。コードが同じインスタンスを指している –

+0

ああ、私はそれを知らなかった、それはおそらく他の問題かもしれない。 –

関連する問題