【问题标题】:Converting an anonymous user to a regular user and saving将匿名用户转换为普通用户并保存
【发布时间】:2016-09-15 16:07:21
【问题描述】:

我正在编写一个 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 时会产生堆栈溢出。堆栈溢出看起来像这样:

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。

有什么想法吗?

【问题讨论】:

    标签: android parse-platform


    【解决方案1】:

    我找到了解决方案!事实证明,在将用户转换为注册用户之前,您必须先保存匿名用户。如果您先保存用户,将用户转换为注册用户,然后执行 saveInBackground,您将不会得到 stackoverflow。所以转换匿名用户的完整代码是:

    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();
    

    在这里您可以看到用户在创建后立即保存。

    【讨论】:

      【解决方案2】:
      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();
                                      }
                                  }
                              });
                          }
                      }
                  });
              }
          })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        • 2012-05-30
        • 2019-11-05
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多