2016-11-13 114 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(...)

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

的可能重复[这是什么commit()和应用(的区别)在共享偏好](http://stackoverflow.com/questions/5960678/whats-the-difference-between-commit-and-apply-in-shared-preference) –

+0

你怎么使用这个类?你从哪里读取和写入数据? – clownba0t

+0

@ clownba0t编辑了问题以获取更多信息。 – kennyYice23

回答

1
  • ,因为,你用editor.apply(),而不是editor.commit(),在读取数据之前,您的数据可能尚未写入文件。

尝试使用editor.commit()代替,像这样(editor.apply()是异步的,不会立即修改写入磁盘不像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

)我不确定这是否正确。SharedPreferences文档指出:“对于任何特定的首选项,这个类都有一个所有客户共享的实例。”(假设这些客户端在同一个进程内),并且,尽管'apply'被认为是异步的,但它只是写入到异步磁盘上的变化。根据文档,“...,apply()内存中的SharedPreferences立即启动异步提交到磁盘......“ – clownba0t

+1

SharedPreferences是用** Singleton **实现的,所以你不能创建它的新实例..所有的引用在这个代码指向同一个实例 –

+0

哦,我不知道,那么它可能是另一个问题。 –