Android 当我注销当前用户然后重新登录时,解析上载的值变为0
这是一个应用程序的简单设置页面。当我单击applyButton时,它将获取当前seekerbar进度值并将其上载到云。它完全可以正常工作,就像我离开设置页面然后返回时,值被保存一样。但是,当我注销当前用户,然后重新登录并转到设置页面时,出于某种原因,从云中提取的值为0 在代码的底部,我有一个名为Android 当我注销当前用户然后重新登录时,解析上载的值变为0,android,Android,这是一个应用程序的简单设置页面。当我单击applyButton时,它将获取当前seekerbar进度值并将其上载到云。它完全可以正常工作,就像我离开设置页面然后返回时,值被保存一样。但是,当我注销当前用户,然后重新登录并转到设置页面时,出于某种原因,从云中提取的值为0 在代码的底部,我有一个名为userIsLoggedIn()的方法。我的日志声明如下: Log.d(TAG, "got user settings from database"); Log.d(TAG, "desired work
userIsLoggedIn()
的方法。我的日志声明如下:
Log.d(TAG, "got user settings from database");
Log.d(TAG, "desired work time: " + workFromDatabase);
Log.d(TAG, "desired rest time " + restFromDatabase);
也许我没有意识到一些事情,因为我从云中检索到的布尔值非常好。只有int值给了我这个问题
public class SettingsScreen extends AppCompatActivity {
public static final String TAG = SettingsScreen.class.getSimpleName();
private static final String ACCESSEDSETTINGS = "accessed_settings";
@Bind(R.id.workText)
TextView workText;
@Bind(R.id.restText)
TextView restText;
@Bind(R.id.workSeekBar)
SeekBar workBar;
@Bind(R.id.restSeekBar)
SeekBar restBar;
@Bind(R.id.applyButton)
Button applyButton;
public static final int MAX_WORK = 60;
public static final int MIN_WORK = 5;
public static final int MAX_REST = 60;
public static final int MIN_REST = 1;
public static final String WORK = "work"; //these two will be the data uploaded to the database
public static final String REST = "rest";
public static final String LOCALWORK = "localwork"; //these two will be data sent back to main activity. only locally saved
public static final String LOCALREST = "localrest";
int workFromDatabase;
int restFromDatabase;
Boolean databaseHasValue = false;
private int mDesiredWorkTime;
private int mDesiredRestTime;
private ParseUser mUser;
Boolean isLoggedIn;
Boolean registeredUserAccessedSettings = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings_screen);
ButterKnife.bind(this);
Intent intent = getIntent();
isLoggedIn = intent.getBooleanExtra("currentUser", false);
if (isLoggedIn) {
userIsLoggedIn();
Log.d(TAG, "Database has value? " + databaseHasValue);
} else {
workBar.setMax(MAX_WORK - MIN_WORK);
workBar.setProgress(25 - MIN_WORK);
workBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mDesiredWorkTime = MIN_WORK + progress;
workText.setText("Current: " + mDesiredWorkTime + " minutes");
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
restBar.setMax(MAX_REST - MIN_REST);
restBar.setProgress(5 - MIN_REST);
restBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mDesiredRestTime = MIN_REST + progress;
restText.setText("Current: " + mDesiredRestTime + " minutes");
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
applyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isLoggedIn) {
mUser.put(WORK, mDesiredWorkTime);
mUser.put(REST, mDesiredRestTime);
mUser.put(ACCESSEDSETTINGS, true); //when user clicks apply, ACCESSEDSETTINGS will be true and so the if statement in the method below wont run
Log.d(TAG, "putting desired user settings into database");
Log.d(TAG, "desired work time: " + mDesiredWorkTime);
Log.d(TAG, "desired rest time " + mDesiredRestTime);
}
Intent intent = new Intent(SettingsScreen.this, MainActivity.class);
intent.putExtra(LOCALWORK, mDesiredWorkTime);
intent.putExtra(LOCALREST, mDesiredRestTime);
startActivity(intent);
}
});
}
public void userIsLoggedIn() {
if (isLoggedIn) {
mUser = ParseUser.getCurrentUser();
registeredUserAccessedSettings = mUser.getBoolean(ACCESSEDSETTINGS);
Log.d(TAG, "Has user accessed settings before? " + registeredUserAccessedSettings);
if (!registeredUserAccessedSettings) { //this code will run first time user accesses settings with parse
workFromDatabase = 25;
restFromDatabase = 5;
Log.d(TAG, "launched settings with account for first time");
} else {
workFromDatabase = mUser.getInt(WORK);
restFromDatabase = mUser.getInt(REST);
workText.setText("Current: " + workFromDatabase + " minutes");
restText.setText("Current: " + restFromDatabase + " minutes");
databaseHasValue = true;
Log.d(TAG, "got user settings from database");
Log.d(TAG, "desired work time: " + workFromDatabase);
Log.d(TAG, "desired rest time " + restFromDatabase);
}
workBar.setMax(MAX_WORK - MIN_WORK);
workBar.setProgress(workFromDatabase - MIN_WORK);
workBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mDesiredWorkTime = MIN_WORK + progress;
workText.setText("Current: " + mDesiredWorkTime + " minutes");
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
restBar.setMax(MAX_REST - MIN_REST);
restBar.setProgress(restFromDatabase - MIN_REST);
restBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mDesiredRestTime = MIN_REST + progress;
restText.setText("Current: " + mDesiredRestTime + " minutes");
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
}
}
问题很简单。你不是“上传到云”,你只是在你的local
ParseUser
对象上设置这些值
例如:
mUser.put(WORK, mDesiredWorkTime);
未将任何内容保存到远程数据库。它只是将WORK
键所指示的字段与mDesiredWorkTime
中存储的值一起设置在本地
对象中
要解决您的问题,请更改以下内容:
mUser.put(WORK, mDesiredWorkTime);
mUser.put(REST, mDesiredRestTime);
mUser.put(ACCESSEDSETTINGS, true);
为此:
mUser.put(WORK, mDesiredWorkTime);
mUser.put(REST, mDesiredRestTime);
mUser.put(ACCESSEDSETTINGS, true);
mUser.saveInBackground(); // <----------------------- THIS SAVES YOUR USER TO THE DATABASE
mUser.put(工时,mDesiredWorkTime);
mUser.put(REST,mDesiredRestTime);
mUser.put(ACCESSEDSETTINGS,true);
mUser.saveInBackground();//哦,我真蠢!我完全忘记了我需要使用saveInBackground()。非常感谢:)