将匿名用户转换为普通用户并保存

时间:2014-12-21 23:56:37

标签: android parse-platform

我正在编写一个Parse Android应用程序,它通过启用自动用户创建来使用匿名用户。我可以成功注册该用户(将匿名用户转换为普通用户),然后登录。两个调用都成功返回。然后,当我在用户对象上设置数据并尝试保存用户时,我在ParseObject类中获得了一个stackoverflow。

我的代码看起来像这样(简化示例代码):

user.setUsername("MyUserName");
    final String password = new PasswordGenerator().nextSessionId();
    user.setPassword(password);
    try {
        user.signUp();
        ParseUser.logInInBackground(verification.getPhoneNumber(), password, new     LogInCallback() {
            @Override
            public void done(final ParseUser parseUser, final ParseException e) {
                if (parseUser == null) {
                    requestListener.onError(e);
                } else {
                    parseUser.put("phone_no", "123");
                    parseUser.saveInBackground(new SaveCallback() { // This generates a stackoverflow
                        @Override
                        public void done(final ParseException e) {
                            int i = 0;
                            System.out.println("i = " + i);
                        }
                    });
//                                requestListener.onSuccess(null);
                }
            }
        });
    } catch (ParseException e) {
        e.printStackTrace();
    }

在ParseUser上调用saveInBackground时会生成堆栈溢出。 stackoverflow看起来像这样:

java.lang.StackOverflowError
        at com.parse.ParseObject.isDataAvailable(ParseObject.java:3212)
        at com.parse.ParseObject.checkGetAccess(ParseObject.java:3284)
        at com.parse.ParseObject.getString(ParseObject.java:2867)
        at com.parse.ParseUser.getUsername(ParseUser.java:401)
        at com.parse.ParseUser.signUpAsync(ParseUser.java:665)
        at com.parse.ParseUser.resolveLazinessAsync(ParseUser.java:1397)
        at com.parse.ParseUser.saveAsync(ParseUser.java:502)
        at com.parse.ParseUser.signUpAsync(ParseUser.java:681)
        at com.parse.ParseUser.resolveLazinessAsync(ParseUser.java:1397)
        at com.parse.ParseUser.saveAsync(ParseUser.java:502)
        at com.parse.ParseUser.signUpAsync(ParseUser.java:681)

我使用的Parse版本是1.8.0。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我找到了解决方案!事实证明,在将用户转换为注册用户之前,您必须先保存匿名用户。如果先保存用户,将用户转换为已注册的用户,然后执行saveInBackground,则无法获得堆栈溢出。因此,转换匿名用户的完整代码是:

final String accountUsername = username.getText().toString();
final String accountPassword = password.getText().toString();
final ParseUser user = ParseUser.getCurrentUser();
user.setUsername(accountUsername);
user.setPassword(accountPassword);
user.signUpInBackground(new SignUpCallback() {
    @Override
    public void done(final ParseException e) {
        if (e != null) {
            Toast.makeText(MainActivity.this, "Signup Fail", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        } else {
            Toast.makeText(MainActivity.this, "Signup success", Toast.LENGTH_SHORT).show();
            final ParseUser user = ParseUser.getCurrentUser();
            user.put("phone_no", "31743379507");
            user.saveInBackground(new SaveCallback() {
                @Override
                public void done(final ParseException e) {
                    if (e != null) {
                        Toast.makeText(MainActivity.this, "Save data Fail", Toast.LENGTH_SHORT).show();
                        e.printStackTrace();
                    } else {
                        Toast.makeText(MainActivity.this, "Save data success", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    }
});

请注意,SignupCallback中的saveInBackground是可选的。您还可以在调用signUpInBackground之前在用户上设置此数据,并保存额外的往返。这纯粹是出于演示目的。

此外,假设以下代码放在Application类中以允许匿名用户:

ParseUser.enableAutomaticUser();
ParseUser.getCurrentUser().saveInBackground();

您在此处看到用户在创建后即被保存。

答案 1 :(得分:1)

findViewById(R.id.createUser).setOnClickListener(newView.OnClickListener() {        
   @Override

        public void onClick(final View v) {

            final String accountUsername = username.getText().toString();

            final String accountPassword = password.getText().toString();

            final ParseUser user = ParseUser.getCurrentUser();

            user.setUsername(accountUsername);

            user.setPassword(accountPassword);

            user.signUpInBackground(new SignUpCallback() {

                @Override

                public void done(final ParseException e) {

                    if (e != null) {

                        Toast.makeText(MainActivity.this, "Signup Fail", 
Toast.LENGTH_SHORT).show();

   Log.e(TAG, "Signup fail", e);

   } else
{             Toast.makeText(MainActivity.this,"Signupsuccess",Toast.LENGTH_SHORT).show();

                        final ParseUser user = ParseUser.getCurrentUser();

                        user.put("phone_no", "31612345678");

                        user.saveInBackground(new SaveCallback() {

                            @Override

                            public void done(final ParseException e) {

                                if (e != null) {

 Toast.makeText(MainActivity.this, "Save data Fail",             Toast.LENGTH_SHORT).show();

    Log.e(TAG, "Signup fail", e);

                                } else {
                                    Toast.makeText(MainActivity.this, "Save 
data success", Toast.LENGTH_SHORT).show();
                                }
                            }
                        });
                    }
                }
            });
        }
    })