Android:更新ParseUsers

时间:2015-05-22 16:57:23

标签: android android-activity parse-platform

我正在使用ParseUser进行用户管理。拥有用户名(唯一),我计划查询User类以识别用户,然后将新分数添加到“score”字段,就像排行榜一样。编码如下:

代码:

public void update_user_score(String username, int original_score, int add)
{
    final int new_score = original_score + add;  
    ParseQuery<ParseUser> query = ParseUser.getQuery();
    query.whereEqualTo("username", username);
    query.setLimit(1);

    query.findInBackground(new FindCallback() 
    {
          public void done(final ParseObject object, ParseException e) 
          {
            if (e == null) 
            {
                object.saveInBackground(new SaveCallback() 
                {
                    public void done(ParseException e) 
                    {
                        object.put("score", new_score);                                 
                        object.saveInBackground();                                      
                        onBackPressed();                            
                    }
                });
            }
          }
    });
}

情况: 它声明The type new FindCallback(){} must implement the inherited abstract method FindCallback.done(List, ParseException)。我试过FindCallback.done并发现它不成功。

问题:

我想问一下如何使用给定的用户名更新用户的其他字段?谢谢!

3 个答案:

答案 0 :(得分:4)

根据解析文档说,

默认情况下,ParseUser类是安全的。存储在ParseUser中的数据只能由该用户修改。默认情况下,任何客户端仍可读取数据。因此,一些ParseUser对象被认证并且可以被修改,而其他对象是只读的。

具体来说,除非使用经过身份验证的方法(如logIn或signUp)获取ParseUser,否则无法调用任何保存或删除类型方法。这可确保只有用户才能更改自己的数据。

以下说明了此安全策略:

ParseUser user = ParseUser.logIn("my_username", "my_password");
user.setUsername("my_new_username"); // attempt to change username
user.saveInBackground(); // This succeeds, since the user was authenticated on the device

// Get the user from a non-authenticated manner
ParseQuery<ParseUser> query = ParseUser.getQuery();
query.getInBackground(user.getObjectId(), new GetCallback<ParseUser>() {
  public void done(ParseUser object, ParseException e) {
    object.setUsername("another_username");

    // This will throw an exception, since the ParseUser is not authenticated
    object.saveInBackground();
  }
});

请浏览此链接Reference

答案 1 :(得分:1)

public void update_user_score(String username, int original_score, int add)
{
  final int new_score = original_score + add;  
  ParseQuery<ParseUser> query = ParseUser.getQuery();
  query.whereEqualTo("username", username);
  query.setLimit(1);

query.findInBackground(new FindCallback() 
{
      public void done(final ParseUser object, ParseException e) 
      {
        if (e == null) 
        {   
            object.put("score", new_score);
            object.saveInBackground(new SaveCallback() 
            {
                public void done(ParseException e) 
                {

                    if(e==null)                                   
                    onBackPressed();                            
                }
            });
        }
      }
});
}

答案 2 :(得分:0)

据我所知,你的问题是;您希望通过使用指定的用户ID在用户表中查找用户条目并更新分数字段。第一个建议,而不是findInBackground使用getFirstInBackground。然后检查返回的用户对象,如果不是null,则执行用户更新操作。然后调用saveInBackground。 saveInBackground用于保存成功时的perfroming操作。在您的代码中,我看到您尝试再次使用done方法保存对象。另外,一个建议是控制ACL。

ParseQuery<ParseUser> query = ParseUser.getQuery();
query.getFirstInBackground(someUserId, new GetCallback<ParseUser>() {
    public void done(ParseUser user, ParseException e) {
        if (e == null) {
            // No error e is null
            // check user object
            if (user == null) {
                // no user , error
            } else {
                // perfrom save operation
                //  put score field
                // call save in background
                // in done method update UI for example.
            }
        } else {
            // Something went wrong.
        }
    }
});