Android 当我注销当前用户然后重新登录时,解析上载的值变为0

Android 当我注销当前用户然后重新登录时,解析上载的值变为0,android,Android,这是一个应用程序的简单设置页面。当我单击applyButton时,它将获取当前seekerbar进度值并将其上载到云。它完全可以正常工作,就像我离开设置页面然后返回时,值被保存一样。但是,当我注销当前用户,然后重新登录并转到设置页面时,出于某种原因,从云中提取的值为0 在代码的底部,我有一个名为userIsLoggedIn()的方法。我的日志声明如下: Log.d(TAG, "got user settings from database"); Log.d(TAG, "desired work

这是一个应用程序的简单设置页面。当我单击applyButton时,它将获取当前seekerbar进度值并将其上载到云。它完全可以正常工作,就像我离开设置页面然后返回时,值被保存一样。但是,当我注销当前用户,然后重新登录并转到设置页面时,出于某种原因,从云中提取的值为0

在代码的底部,我有一个名为
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()。非常感谢:)