一次 facebook 登录时,在 Parse 数据浏览器中创建了两行用户。请查看详情

Two rows of users getting created in Parse data browser on a single facebook login. Please see details

我在我的应用程序中集成了 facebook 登录并已将其与 Parse 结合。 因此,每当用户通过 Facebook 登录时,它都会存储在 Parse 中。

问题是通过 facebook 登录一次后,会创建 2 行用户,如下所示:

上面显示的两个用户是相同的。在一行中,给出了姓名和电子邮件,在另一行中仅给出了 facebook id。

这里是 SignUpScreen.java 文件的代码:

public class SignUpScreen extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {

    Button facebookLoginButton;
    CircleImageView mProfileImage;
    TextView mUsername, mEmailID;
    Profile mFbProfile;
    ParseUser user;
    Bitmap bmp = null;
    public String name, email, userID;
    public static final List<String> mPermissions = new ArrayList<String>() {{
        add("public_profile");
        add("email");
    }};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_sign_up_screen);

        mProfileImage = (CircleImageView) findViewById(R.id.user_profile_image);
        mUsername = (TextView) findViewById(R.id.userName);
        mEmailID = (TextView) findViewById(R.id.aboutUser);

        mFbProfile = Profile.getCurrentProfile();

        //mUsername.setVisibility(View.INVISIBLE);
        //mEmailID.setVisibility(View.INVISIBLE);

        facebookLoginButton = (Button) findViewById(R.id.facebook_login_button);
        facebookLoginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                ParseFacebookUtils.logInWithReadPermissionsInBackground(SignUpScreen.this, mPermissions, new LogInCallback() {
                    @Override
                    public void done(ParseUser user, ParseException err) {

                        if (user == null) {
                            Log.d("MyApp", "Uh oh. The user cancelled the Facebook login.");
                        } else if (user.isNew()) {
                            Log.d("MyApp", "User signed up and logged in through Facebook!");
                            getUserDetailsFromFacebook();
                            final Handler handler3 = new Handler();
                            handler3.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    saveNewUser();
                                }
                            }, 5000);
                        } else {
                            Log.d("MyApp", "User logged in through Facebook!");
                        }
                    }
                });

            }
        });

    }

    public void saveNewUser() {
        user = new ParseUser();
        user.setUsername(name);
        user.setEmail(email);
        user.setPassword("hidden");

        user.signUpInBackground(new SignUpCallback() {
            @Override
            public void done(ParseException e) {
                if (e == null) {
                    Toast.makeText(SignUpScreen.this, "SignUp Succesful", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(SignUpScreen.this, "SignUp Unsuccesful", Toast.LENGTH_LONG).show();
                    Log.d("error when signingup", e.toString());
                }
            }
        });
    }

    private void getUserDetailsFromFacebook() {

        final GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(),
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(
                            JSONObject object,
                            GraphResponse response) {
                        // Application code
                        //Log.d("response", "response" + object.toString());
                        final Intent profileIntent = new Intent(SignUpScreen.this, ProfileActivity.class);
                        Bundle b = new Bundle();
                        try {
                            name = response.getJSONObject().getString("name");
                            mUsername.setText(name);
                            email = response.getJSONObject().getString("email");
                            mEmailID.setText(email);
                            userID = response.getJSONObject().getString("id");
                            new ProfilePicAsync().execute(userID);

                            b.putString("userName", name);
                            b.putString("userEmail", email);

                            profileIntent.putExtras(b);
                            startActivity(profileIntent);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });

        Bundle parameters = new Bundle();
        parameters.putString("fields", "name, email, id");
        request.setParameters(parameters);
        request.executeAsync();

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        ParseFacebookUtils.onActivityResult(requestCode, resultCode, data);

    }
}

请告诉我是什么导致了这件事发生。

您正在 saveNewUser() 中创建新用户,而不是在 saveNewUser() 中传递 user

When logInWithReadPermissionsInBackground call it will create one parseUser in Backend and it will return that user after done. You can update that user. or you can get that user with ParseUser parseUser = ParseUser.getCurrentUser();

handler3.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                saveNewUser(user);
                            }
                        }, 5000);

public void saveNewUser(ParseUser user) {
    user.setUsername(name);
    user.setEmail(email);
    user.setPassword("hidden");
}

您也可以像这样更新您的 parseUser

public void saveNewUser() {
ParseUser user = ParseUser.getCurrentUser();// get current user, no need to pass as arguement
    user.setUsername(name);
    user.setEmail(email);
    user.setPassword("hidden");
}

注意user.isNew()表示你在做singup。您应该仅在 isNew 时更新用户。否则它会在你每次 login

时更新