Android——在活动之间传递ParseUser对象

3
在我的Android应用程序中,我有3个活动供用户填写其个人资料和注册:
1. 在第一个活动RegisterActivity中:用户可以填写他们的姓名、地址、电话号码、紧急联系人等信息。 2. 在第二个活动AppearanceActivity中:用户可以填写他们的种族、身高、体重、头发颜色、眼睛颜色等信息。 3. 在第三个活动PinsActivity中:用户可以填写他们的Pin号码、第二个Pin号码和密码。
我能够在Parse中通过传递ParseUser对象并保存用户在第一个和第二个活动中的输入。然而,在第三个活动中,我无法在Parse上保存Pin号码和密码。我使用Log.d检查了userID,它对于所有3个活动都是相同的,同时Pins和密码字段都有值。我只是不明白为什么我不能使用ParseUser对象的saveInBackground来保存最后一个活动中的Pins和密码。我想知道是否有任何专家可以帮助我解决这个问题。非常感谢。
1. 注册活动代码: public class RegisterActivity extends Activity {
protected EditText mFirstName;
protected EditText mMiddleName;
protected EditText mLastName;
protected EditText mUserEmail;
protected EditText mPhoneNumber;
protected EditText mAddressLine1;
protected EditText mAddressLine2;
protected EditText mEmergencyName;
protected EditText mEmergencyPhone;
protected EditText mEmergencyRelationship;
protected EditText mEmergencyOtherInfo;
protected Button mNextPageButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);

    //Parse.enableLocalDatastore(this);
    Parse.initialize(this, "XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXX");

    //Initialize
    mFirstName = (EditText)findViewById(R.id.firstNameRegisterEditText);
    mMiddleName = (EditText)findViewById(R.id.middleNameRegisterEditText);
    mLastName = (EditText)findViewById(R.id.lastNameRegisterEditText);
    mUserEmail = (EditText)findViewById(R.id.emailRegisterEditText);
    mPhoneNumber = (EditText)findViewById(R.id.phoneRegisterEditText);
    mAddressLine1 = (EditText)findViewById(R.id.addressRegisterText);
    mAddressLine2 = (EditText)findViewById(R.id.address2RegisterText);
    mEmergencyName = (EditText)findViewById(R.id.emergencyNameEditText);
    mEmergencyPhone = (EditText)findViewById(R.id.emergencyPhoneEditText);
    mEmergencyRelationship = (EditText)findViewById(R.id.emergencyRelationshipEditText);
    mEmergencyOtherInfo = (EditText)findViewById(R.id.medicalInfoEditText);
    mNextPageButton = (Button)findViewById(R.id.nextPageButton);

    //Listen to register button click
    mNextPageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Get first name, middle name, last name, user email, phone number, address line 1, address line 2,
            //emergency name, emergency phone, emergency relationship, emergency other info and convert them to string
            String firstName = mFirstName.getText().toString().trim();
            String middleName = mMiddleName.getText().toString().trim();
            String lastName = mLastName.getText().toString().trim();
            String userEmail = mUserEmail.getText().toString().trim();
            String phoneNumber = mPhoneNumber.getText().toString().trim();
            String addressLine1 = mAddressLine1.getText().toString().trim();
            String addressLine2 = mAddressLine2.getText().toString().trim();
            String emergencyName = mEmergencyName.getText().toString().trim();
            String emergencyPhone = mEmergencyPhone.getText().toString().trim();
            String emergencyRelationship = mEmergencyRelationship.getText().toString().trim();
            String emergencyOtherInfo = mEmergencyOtherInfo.getText().toString().trim();

            //String password = mUserPassword.getText().toString().trim();

            final ParseUser user = new ParseUser();

            //Store user in parse
            user.put("firstName", firstName);
            user.put("middleName", middleName);
            user.put("lastName", lastName);
            user.put("email", userEmail);
            user.put("phoneNumber", phoneNumber);
            user.put("addressLine1", addressLine1);
            user.put("addressLine2", addressLine2);
            user.put("emergencyName", emergencyName);
            user.put("emergencyPhone", emergencyPhone);
            user.put("emergencyRelationship", emergencyRelationship);
            user.put("otherInfo", emergencyOtherInfo);
            user.put("username", userEmail);

            //Store empty values for username, password, and email because the signUpInBackground requires these fields
            //We will actually add these values in later
            user.setUsername(userEmail);
            user.setEmail(userEmail);
            user.setPassword("");

            //Need to call Signup first
            user.signUpInBackground(new SignUpCallback() {
                @Override
                public void done(ParseException e) {
                    if (e == null){
                        //Saved successfully
                        //Passing user object to AppearanceActivity and take user to appearance register page
                        Intent intent = new Intent(RegisterActivity.this, AppearanceActivity.class);
                        intent.putExtra("user_id", user.getObjectId());
                        startActivity(intent);
                    } else {
                        //Save failed
                        Log.d("", "User update error: " + e);
                    }
                }
            });
        }
    });
}
}

第二个 AppearanceActivity

public class AppearanceActivity extends Activity {
protected EditText mEthnicity;
protected EditText mHeight;
protected EditText mWeight;
protected EditText mHairColor;
protected EditText mEyeColor;
protected EditText mBirthday;
protected EditText mGender;
protected Button mNextPageButtonOnAppearance;
String userId;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_appearance);

    //Receiving
    Intent intent = getIntent();
    //assigns data that was passed from previous activity.
    userId = intent.getExtras().getString("user_id");
    Log.d("Kiem", "userID is: " + userId);

    //sets variables to their respective xml elements.
    mEthnicity = (EditText)findViewById(R.id.ethnicityEditText);
    mHeight = (EditText)findViewById(R.id.heightNumberPicker);
    mWeight = (EditText)findViewById(R.id.weightEditText);
    mHairColor = (EditText)findViewById(R.id.hairEditText);
    mEyeColor = (EditText)findViewById(R.id.eyeEditText);
    mBirthday = (EditText)findViewById(R.id.birthdayDatePicker);
    mGender = (EditText)findViewById(R.id.genderEditText);
    mNextPageButtonOnAppearance = (Button)findViewById(R.id.nextPageButtonOnAppearance);

    //Listen to Next Page button to click
    mNextPageButtonOnAppearance.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            //Get ethnicity, height, weight, hair color, eye color, birthday, gender and covert them to string
            final String ethnicity = mEthnicity.getText().toString().trim();
            final String height = mHeight.getText().toString().trim();
            final String weight = mWeight.getText().toString().trim();
            final String hairColor = mHairColor.getText().toString().trim();
            final String eyeColor = mEyeColor.getText().toString().trim();
            String birthday = mBirthday.getText().toString().trim();
            final String gender = mGender.getText().toString().trim();

            ParseQuery<ParseUser> query = ParseUser.getQuery();
            query.whereEqualTo("objectId", userId);
            // Execute the query to find the object with ID
            query.getInBackground(userId, new GetCallback<ParseUser>() {
                public void done(final ParseUser user, ParseException e) {
                    if (e == null) {
                        user.put("ethnicity", ethnicity);
                        user.put("hairColor", hairColor);
                        user.put("eyeColor", eyeColor);
                        user.put("gender", gender);
                        user.put("height", height);
                        user.put("weight", weight);

                        user.saveInBackground(new SaveCallback() {
                            @Override
                            public void done(ParseException e) {
                                if(e == null){
                                    //Saved successfully
                                    //Passing user object to PinsActivity and take user to Pins register page
                                    Intent intent = new Intent(AppearanceActivity.this, PinsActivity.class);
                                    intent.putExtra("user_id", user.getObjectId());
                                    startActivity(intent);
                                } else {
                                    //Save failed
                                    Log.d("", "User update error: " + e);
                                }
                            }
                        });

                    } else {
                        //Log.d("Kiem", "Error: " + e.getMessage());
                    }
                }
            });


        }
    });

//AlertDialog with list view to select ethnicity
public void alertEthnicityListView(View view){
    final CharSequence[] ethics = {"Caucasian", "African American", "Asian", "Hispanic", "Middle-Eastern/Indian","Native American","Other"};
    AlertDialog.Builder builder = new AlertDialog.Builder(AppearanceActivity.this);
    builder.setTitle("Select your ethinicity");
    builder.setItems(ethics, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int ethic) {
            mEthnicity.setText(ethics[ethic]);
        }
    }).show();
}

//AlertDialog with list view to select hair color
public void alertHairListView(View view){
    final CharSequence[] hairs = {"Brown", "Black", "Blonde", "Red", "Strawberry-Blonde", "Dirty-Blonde", "Dyed-Pink", "Dyed-Blue", "Dyed-Green", "Dyed-Purple", "Dyed-Red"};
    AlertDialog.Builder builder = new AlertDialog.Builder(AppearanceActivity.this);
    builder.setTitle("Select your hair color");
    builder.setItems(hairs, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int hair) {
            mHairColor.setText(hairs[hair]);
        }
    }).show();
}

//AlertDialog with list view to select eye color
public void alertEyeListView(View view){
    final CharSequence[] eyes = {"Green", "Blue", "Hazel", "Brown", "Amber", "Other"};

    AlertDialog.Builder builder = new AlertDialog.Builder(AppearanceActivity.this);
    builder.setTitle("Select your eye color");
    builder.setItems(eyes, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int eye) {
            mEyeColor.setText(eyes[eye]);
        }
    }).show();
}

//AlertDialog with list view to select gender
public void alertGenderListView(View view){
    final CharSequence[] genders = {"Male", "Female"};

    AlertDialog.Builder builder = new AlertDialog.Builder(AppearanceActivity.this);
    builder.setTitle("Select your gender");
    builder.setItems(genders, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int gender) {
            mGender.setText(genders[gender]);
        }
    }).show();
}

//AlertDialog with list view to select birthday
Calendar myCalendar = Calendar.getInstance();
DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        // TODO Auto-generated method stub
        myCalendar.set(Calendar.YEAR, year);
        myCalendar.set(Calendar.MONTH, monthOfYear);
        myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
        updateLabel();
    }

};

private void updateLabel() {
    String myFormat = "MM/dd/yy"; //In which you need put here
    SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
    mBirthday.setText(sdf.format(myCalendar.getTime()));
}
}

3rd PinsActivity

public class PinsActivity extends Activity {
protected EditText mPassword;
protected EditText mConfirmPassword;
protected Button mRegisterButton;
protected EditText mPin;
protected EditText mFakePin;
String userId;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pins);

    //Receiving
    Intent intent = getIntent();
    //assigns data that was passed from previous activity.
    userId = intent.getExtras().getString("user_id");
    Log.d("Kiem2", "userID is: " + userId);

    //sets variables to their respective xml elements.
    mPassword = (EditText)findViewById(R.id.passwordEditText);
    mConfirmPassword = (EditText)findViewById(R.id.confirmPasswordEditText);
    mRegisterButton = (Button)findViewById(R.id.registerButton);
    mPin = (EditText)findViewById(R.id.pinEditText);
    mFakePin = (EditText)findViewById(R.id.fakePinEditText);

    //Force soft keyboard to appear for user to type in password and confirm password
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(mPassword, InputMethodManager.SHOW_IMPLICIT);
    imm.showSoftInput(mConfirmPassword, InputMethodManager.SHOW_IMPLICIT);

    //Listen to Register Button to click
    mRegisterButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("Kiem3", "userID is: " + userId);
            signup();
        }
    });
}

private void signup(){
    //get values for password, confirm password, pin, fake pin fields and convert them to strings
    final String password = mPassword.getText().toString();
    final String confirmPassword = mConfirmPassword.getText().toString();
    final String pin = mPin.getText().toString().trim();
    final String fakePin = mFakePin.getText().toString().trim();

    Log.d("Value of fakepin ", "is: " + fakePin);

    ParseQuery<ParseUser> query = ParseUser.getQuery();
    query.whereEqualTo("objectId", userId);
    // Execute the query to find the object with ID
    query.getInBackground(userId, new GetCallback<ParseUser>() {
        public void done(final ParseUser user, ParseException e) {
            if (e == null) {
                user.put("password", password);
                user.put("pin", pin);
                user.put("fakePin", fakePin);
                user.saveInBackground(new SaveCallback() {
                    @Override
                    public void done(ParseException e) {
                        if (e == null) {
                            // Saved successfully.
                            //Passing user object to AppearanceActivity and take user to appearance register page
                            Intent intent = new Intent(PinsActivity.this, MainActivity.class);
                            intent.putExtra("user_id", user.getObjectId());
                            startActivity(intent);
                        } else {
                            // The save failed.
                            Log.d("", "User update error: " + e);
                        }
                    }
                });
                Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_LONG).show();
            } else {
                //Log.d("Kiem", "Error: " + e.getMessage());
            }
        }
    });

    //Check if password and confirm password fields are not blank and that they're matched
    boolean validationError = false;
    StringBuilder validationErrorMessage = new StringBuilder(getString(R.string.error_intro));

    if (password.length() == 0) {
        if (validationError) {
            validationErrorMessage.append(getString(R.string.error_join));
        }
        validationError = true;
        validationErrorMessage.append(getString(R.string.error_blank_password));
    }
    if (!password.equals(confirmPassword)) {
        if (validationError) {
            validationErrorMessage.append(getString(R.string.error_join));
        }
        validationError = true;
        validationErrorMessage.append(getString(R.string.error_mismatched_passwords));
    }
    validationErrorMessage.append(getString(R.string.error_end));

    //Append validationErrorMessage with the appropriate error strings as well as set validationError as errors are detected
    if (validationError) {
        Toast.makeText(PinsActivity.this, validationErrorMessage.toString(), Toast.LENGTH_LONG).show();
        return;
    }
}
}

我建议你将ParseUser存储在一个静态类中。 - Semih
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - nasch
嗨@nasch,我没有收到任何错误信息。引脚和密码数据只是没有显示在Parse数据库中。我还注意到,在我放入Intent后,第三个活动没有连接到下一个活动。因此,我认为第三个活动中的user.saveInBackground(new SaveCallback() {....}代码块没有运行。 - Kiem Nguyen
尝试一些记录日志和/或调试器,以便您可以确定正在发生什么。然后,如果您还没有找到解决方案,请发布一个更新,其中包含您找到的更多细节。 - nasch
1个回答

1

我通过使用bundle传递数据解决了问题,然后在最后一个活动中上传数据到Parse。谢谢大家。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接